r语言 - envir = parent.env(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(environment(来保护我的函数不受任何修改?如果我没有记错的话,这个过程被称为";闭合"-这就是我感兴趣的。

您要查找的是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

最新更新