R匿名函数: capture variables by value

标签 r lambda anonymous-function

我已经定义了一个匿名函数列表,这些函数使用在外部范围中定义的变量。

funclist <- list()
for(i in 1:5)
{
  funclist[[i]] <- function(x) print(i)
}

funclist[[1]]('foo')

输出是:
[1] 5

看来通过引用捕获。我希望它被值(value)捕获,即输出应该是
[1] 1

有没有办法告诉 R 捕获 按值(value)而不是按引用?

最佳答案

当您运行 for循环,这将在循环运行的环境中创建一个变量,并且在循环中创建的函数也从该环境运行。因此,每当您运行以这种方式创建的使用循环中的索引值的函数时,它们只能访问最终值,并且只要该变量仍然存在(尝试 rm(i) 并尝试在名单)。

您需要做的是将索引值绑定(bind)到自己环境中的函数。 lapply会自动为您执行此操作。但是,惰性评估存在一个问题。你要做的也是force评价i在创建匿名函数之前:

funclist <- lapply(1:5, function(i) {force(i); function(x) print(i)})
funclist[[1]]('foo')
[1] 1
funclist[[5]]('foo')
[1] 5

关于R匿名函数: capture variables by value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216909/

相关文章:

python - 使用匿名lambda实现阶乘函数的python代码的解释是什么

javascript - 自动执行匿名 JavaScript 函数的括号位置?

r - 如何将数据框拆分为给定列名的数据框列表?

将数据读入向量

r - 如何对 lmer() 中的随机部分使用 update() ?

C# - 重写对 Action<> 的委托(delegate)调用

PHP 关闭 : what to do next with it?

r - 两次观察之间的平均秒数

c# - ParameterizedThreadStart 是否保证对象实例不会被垃圾回收?

java - lambda Java 8,如何映射作为过滤操作结果字段的列表