所以我编写了以下函数:
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(来保护我的函数不受任何修改?如果我没有记错的话,这个过程被称为";闭合"-这就是我感兴趣的。
您要查找的是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