我需要在函数中分配一个变量,该变量的名称是函数的参数,我需要稍后在函数外部访问它。我认为<<-
在另一种情况下会这样做,但由于变量的名称是动态的,我认为我需要assign()
。
我现在有什么
assignVar = function(varname) {
assign(varname,"blabla")
}
assignVar("foo")
foo
返回通常的CCD_ 3。
assign
功能或任何其他秘密武器有什么选择吗?我看过文档,但我仍然对环境感到非常困惑。。。(R初学者)。
在使用<<-
之前了解它的行为非常重要。一旦了解了该行为,您还会注意到,您无法使用assign
来实现其行为(至少不太容易)。这里有一个简单的例子:
a <- 1
f1 <- function(){
a <<- 2
NULL
}
f1()
a
# [1] 2
a <- 1
f2 <- function(){
a <- 2
f3 <- function(){
a <<- 3
}
f3()
NULL
}
f2()
a
# [1] 1
如果可能的话,<<-
通过分配到父环境中来工作。如果那里没有现有的a
对象(在本例中),它会上升到另一个级别并重复此操作,直到到达全局环境,如果没有其他较低的环境工作,它最终会在全局环境中进行分配。因此,在上面的例子中,f1()
导致全局环境的改变,而f2()
没有。如果您注释掉f2
的a<-2
行,则全局环境确实发生了变化。
要使用assign
实现相同的行为,您需要编写一个更复杂的函数,该函数在父环境中循环,直到到达全局环境。无论如何,通常不鼓励让函数产生副作用(因为通常会给代码带来不必要的复杂性,尤其是当这些副作用发生在全局环境中时)。
我强烈建议您不要这样做:
assignVar = function(varname, envir = globalenv()) {
assign(varname, "blabla", envir=envir)
invisible(NULL)
}
assignVar("foo", envir=globalenv())
foo
[1] "blabla"