在闭包中变量变量

csl*_*csl 5 closures scope r

我是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不创建局部变量的情况下进行变异?

gag*_*ews 3

在函数中使用<<-运算符进行赋值add()

\n\n

?"<<-"

\n\n
\n

运算符<<-->>通常仅在函数中使用,并导致在父环境中搜索所分配变量的现有定义。如果找到这样的变量(并且其绑定未锁定),则重新定义其值,否则在全局环境中进行赋值。请注意,它们的语义与 S 语言中的语义不同,但与 R 的作用域规则结合使用非常有用。有关更多详细信息和示例,请参阅 \xe2\x80\x98R 语言定义\xe2\x80\x99 手册。

\n
\n

  • 大多数有经验的 R 用户会惊讶地发现您采用始终使用“&lt;&lt;-”进行赋值的策略。您_应该_将函数的值分配给工作区中的名称。 (3认同)
  • 在这里,它会在`foo()`中找到绑定,所以就可以了。否则,它可能真的很令人毛骨悚然,因此不鼓励使用它(除非你知道你在做什么)。 (2认同)