不应该 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 的循环,跳转到顶层

Kibana插件开发

idea 14运行java工程报错-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME envir

R中的匿名函数