R 在闭包中对变量进行变异
我对R相当陌生,但来自Scheme,它也是词汇范围的,有闭包——我希望能够在闭包中变异外部变量 例如,在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需要类似的东西吗 我做错
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()