我收到了一个使用可怕<<-
的功能。我有什么方法可以沙箱,这样它就不会改变全球环境吗?
例如,我想找到一些东西,这样我可以运行f()
而不更改x的值:
x <- 0
f <- function() x <<- 1
f()
x
# [1] 1
我尝试在已经定义了值的环境中对其进行评估:
local({
x <- 2
f()
})
但这似乎不起作用。有没有办法让我把它包起来保护全球环境?
答案 0 :(得分:5)
赋值<<-
函数将首先查看父环境(函数所在的环境)及其以上,如果它找不到,它将在全局环境中创建一个新环境。
所以诀窍是将f()
包装在另一个函数中并在其中定义,并且还在此包装函数中初始化变量x。然后,它不会影响您在全球环境中的x
:
x <- 0
wrapped_f = function(){
x<-2
function() x <<- 1
f()
print(paste("new x=", x))
}
wrapped_f()
#### "new x= 1"
print(x)
#### [1] 0
同样但没有在包装器中初始化x
它将失败:
x <- 0
wrapped_f = function(){
# x<-2
f <- function() x <<- 1
f()
print(paste("new x=", x))
}
wrapped_f()
#### "new x= 1"
print(x)
#### [1] 1
答案 1 :(得分:2)
一种解决方法是使用生成器模式在单独的环境中定义函数。以下代码适用于我:
x <- -1
generator <- function(){
x <- 0
function() x <<- 1
}
f <- generator()
f()
print(x)
# [1] -1
答案 2 :(得分:2)
我们可以尝试exists
来检查变量是否已经全局定义。
f <- function() {
if(!exists("x"))
x <<- 1
}
x <- 0
x
#[1] 0
f()
x
#[1] 0