不应该 envir = parent.env(environment() 保护我的函数不被修改,尽管在全球环境中发生了啥?
Posted
技术标签:
【中文标题】不应该 envir = parent.env(environment() 保护我的函数不被修改,尽管在全球环境中发生了啥?【英文标题】:Shouldn't envir = parent.env(environment() protect my function from being modified despite what happens in the global environment?不应该 envir = parent.env(environment() 保护我的函数不被修改,尽管在全球环境中发生了什么? 【发布时间】:2021-12-24 06:16:39 【问题描述】:于是我写了如下函数:
deck <- function()
face <- c("Ace","Two","Three", "Four",
"Five", "Six", "Seven", "Eight",
"Nine","Ten", "Jack", "Queen", "King")
hearts <- replicate(13,"Hearts")
diamonds <- replicate(13, "Diamonds")
clubs <- replicate(13, "Clubs")
spades <- replicate(13,"Spades")
suit <- c(diamonds, spades, hearts, clubs)
value <- c(1:13)
assign("deck", data.frame(face,suit,value),
envir = parent.env(environment()))
return(deck)
而且效果很好,它基本上向我展示了一副纸牌。
但是,我认为参数 envir = parent.env(environment() 的意思是如果我之后写了一些东西,例如:
deck <- "Whatever"
函数deck() 函数仍然可以工作——因为对象deck 只在全局环境中被修改,而不是在父环境中。但这并没有发生。
发生了什么:
-
我输入代码,它工作正常 - 它显示一副牌
我给甲板分配了其他东西
当我再次键入 deck() 时,它显示 R 找不到该函数。
谁能解释一下为什么?
我如何正确地使用 parent.env(environment) 来保护我的函数免受任何修改?如果我没记错的话,这个过程被称为“关闭”——这就是我感兴趣的。
【问题讨论】:
您似乎使用的函数名称与用于数据对象的名称相同。可能非常令人困惑。 【参考方案1】:您正在寻找attach
函数而不是assign
函数。例如:
attach(list(deck = function()
face <- c("Ace","Two","Three", "Four",
"Five", "Six", "Seven", "Eight",
"Nine","Ten", "Jack", "Queen", "King")
suit <- c("Hearts", "Diamonds", "Clubs", "Spades")
cbind(expand.grid(face = face, suit = suit), value = 1:13)
))
现在这包含在您的searchpath
中。因此,如果您更改功能,您将屏蔽此功能。但除此之外,您可以使用它。
即:
deck() # Gives you the deck of cards
deck <- "whatever"
deck # gives you whatever
deck() # gives you the deck of cards
【讨论】:
请问你为什么使用 cbind(expand.grid(face = face, suit = suit), value = 1:13) 而不是 data.frame(face,suit,value)? @MarinaBonatti 检查我对suit
的定义我不必replicate
它13 次。尝试expand.rid(1:2, 1:2)
然后尝试data.frame(1:2, 1:2)
并检查差异以上是关于不应该 envir = parent.env(environment() 保护我的函数不被修改,尽管在全球环境中发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章
jags.parallel - get(name, envir = envir) 中的错误:第一个参数无效
envir mensaje a amigos Facebook发送
eval 中的错误(expr,envir,enclos):没有用于 break/next 的循环,跳转到顶层
idea 14运行java工程报错-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME envir