R 在闭包中对变量进行变异

R 在闭包中对变量进行变异,r,scope,closures,R,Scope,Closures,我对R相当陌生,但来自Scheme,它也是词汇范围的,有闭包——我希望能够在闭包中变异外部变量 例如,在 foo <- function() { s <- 100 add <- function() { s <- s + 1 } add() s } cat(foo(), "\n") # prints 100 and not 101 我知道Python有global关键字来声明变量的作用域(但在本例中不起作用)。R需要类似的东西吗 我做错

我对R相当陌生,但来自Scheme,它也是词汇范围的,有闭包——我希望能够在闭包中变异外部变量

例如,在

foo <- function() {
  s <- 100

  add <- function() {
    s <- s + 1
  }

  add()
  s
}

cat(foo(), "\n") # prints 100 and not 101
我知道Python有
global
关键字来声明变量的作用域(但在本例中不起作用)。R需要类似的东西吗

我做错了什么

更新


啊,问题是在
add
中,我正在创建一个新的局部变量
s
,它将外部
s
隐藏起来?如果是这样,我如何在不创建局部变量的情况下对
s
进行变异?

使用
您也可以使用
assign
并使用
envir
参数精确定义范围,其工作方式与
相同。这里还有一种方法比
assign
您所说的“for assignment”更安全.  仅当您希望访问函数外部的名称绑定时(非正式地说),我是否应该始终使用
。否则你根本就不应该使用它:它相当“危险”。它说,
最有经验的R用户看到你在这里采用总是使用
的策略会感到震惊,它会在
foo()
中找到绑定,所以这没关系。否则,它可能真的令人毛骨悚然,因此不鼓励使用它(除非你知道你在做什么)。版主可以作为副本关闭,或者你可以加入并投票关闭会员。@BondedDust Gotcha,我也投票赞成关闭它。只是在谷歌上搜索时遇到了一些问题——事实上,直到我发布到这里,我才找到解决方案。所以其他MOD可能会决定如何处理它。再投票两次,它将被关闭,无论主持人是否注意。您可能会发现引用类工具是一种适合您的编程风格的范例,并且不会被常规的R使用视为危险。它使用命名环境,让您拥有“全局”变量的一些功能。谢谢。我将支持我的投票来结束它。谢谢大家!
$ Rscript foo.R
100
foo <- function() {
  s <- 100

  add <- function() {
   assign("s", s + 1, envir = parent.frame())
  }

  add()
  s
}

cat(foo(), "\n") 
foo <- function() {
  s <- 100
  add <- function(x) x + 1
  s <- add(s)
  s
}

cat(foo(), "\n") 
foo <- function() {
    e <- environment()
    s <- 100

    add <- function() {
        e$s <- e$s + 1
    }

    add()
    s
}

foo()