我想创建一个接收 3 的变量 x 。它创建了另一个范围,其中 x 接收 1 。但是,随着范围结束, x 值将返回到3。我该怎么做?
我的意思是在下面的代码中显示。我想做这样的事情:
x <- 3
{x = 1
print (x)} //{} Is the way I thought to make x=1 be in another scope
print (x)
具有这样的输出:
[1] 1
[1] 1
,但我希望输出为:
[1] 1
[1] 3
您需要在不同的环境中工作。参见http://adv-r.had.co.nz/environments.html
这样做的一种简单方法是使用功能。
x <- 3
funky <- function() {
x = 1
print (x)
}
funky()
# [1] 1
print (x)
# [1] 3
另外,您可以指定环境。
e <- new.env()
x <- 3
e$x <- 1
e$x
# [1] 1
x
# [1] 3
@dason提出了一个很好的观点,即功能local
简化处理替代环境。
x <- 3
local({
x <- 1
print(x)
})
# [1] 1
print(x)
# [1] 3
来自help(local)
本地评估本地环境中的表达。它是等效的 提出evalq,但其默认参数创建了一个新的,空的 环境。这对于创建匿名递归功能很有用 作为一种有限的名称空间功能,因为变量在 从外部看不到环境。
函数具有局部变量,并在检查全局变量之前先查看那里。所以你可以做这样的事情
print_x = function(){
x = 3
print(x)
}
x = 1
> print(x)
[1] 1
> print_x()
[1] 3