envir = parent.env(environment() 不应该保护我的功能不被修改,尽管在全球环境中发生了什么?

Shouldn't envir = parent.env(environment() protect my function from being modified despite what happens in the global environment?

所以我写了下面的函数:

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 仅在全局环境中修改,而不是在父环境中修改。但这并没有发生。

发生的事情是:

  1. 我输入代码,它工作正常 - 它显示了一副牌
  2. 我将其他东西分配给牌组
  3. 当我再次输入 deck() 时,它说 R 找不到那个函数。

有人可以解释一下为什么吗?

以及如何正确使用 parent.env(环境)来保护 我的函数免受任何修改?如果我没记错的话,这个过程叫做“关闭”——这就是我感兴趣的。

您正在查找 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