我是R的新手,但来自Scheme--它也是词法范围并且有闭包 - 我希望能够在闭包中改变外部变量.
例如,在
foo <- function() {
s <- 100
add <- function() {
s <- s + 1
}
add()
s
}
cat(foo(), "\n") # prints 100 and not 101
Run Code Online (Sandbox Code Playgroud)
我希望foo()返回101,但它实际上返回100:
$ Rscript foo.R
100
Run Code Online (Sandbox Code Playgroud)
我知道Python有global关键字来声明变量的范围(虽然不适用于这个例子).R需要类似的东西吗?
我究竟做错了什么?
更新
啊,问题在于add我在创建一个新的局部变量s来遮蔽外部s?如果是这样,我如何在s不创建局部变量的情况下进行变异?
在函数中使用<<-运算符进行赋值add()。
从?"<<-":
\n\n运算符
\n<<-和->>通常仅在函数中使用,并导致在父环境中搜索所分配变量的现有定义。如果找到这样的变量(并且其绑定未锁定),则重新定义其值,否则在全局环境中进行赋值。请注意,它们的语义与 S 语言中的语义不同,但与 R 的作用域规则结合使用非常有用。有关更多详细信息和示例,请参阅 \xe2\x80\x98R 语言定义\xe2\x80\x99 手册。