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 仅在全局环境中修改,而不是在父环境中修改。但这并没有发生。
发生的事情是:
- 我输入代码,它工作正常 - 它显示了一副牌
- 我将其他东西分配给牌组
- 当我再次输入 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
所以我写了下面的函数:
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(环境)来保护 我的函数免受任何修改?如果我没记错的话,这个过程叫做“关闭”——这就是我感兴趣的。
您正在查找 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