如何防止`<< - `在全局环境中分配?

时间:2017-06-28 09:56:03

标签: r

我收到了一个使用可怕<<-的功能。我有什么方法可以沙箱,这样它就不会改变全球环境吗?

例如,我想找到一些东西,这样我可以运行f()而不更改x的值:

x <- 0
f <- function()  x <<- 1
f()
x
# [1] 1

我尝试在已经定义了值的环境中对其进行评估:

local({
  x <- 2
  f()
})

但这似乎不起作用。有没有办法让我把它包起来保护全球环境?

3 个答案:

答案 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