R 函数闭包环境

标签 r closures environment

<分区>

我最近遇到了一些意外的 R 行为,可以使用以下代码以最简单的形式重现:

make.adder <- function(a) {function(x) {x + a}}
s <- list(1, 2)
adders <- lapply(s, make.adder)

我们现在可能期望 adders[[1]] 是一个加 1 的函数,而 adders[[2]] 是一个加 2 的函数。但是,

adders[[1]](1)

返回 3(当我们预期为 2 时)。看看环境

environment(adders[[1]])$a

返回 2,这再次令人惊讶(但一致)。这里发生了什么?

如果我们尝试使用 for 循环,我们会看到类似的行为:

adders <- list()
for (i in seq(1, 2)) {adders[[i]] <- make.adder(i)}

同样,adders[[1]] (1) 返回 3。我们如何创建一个包含 100 个函数的列表,使得第 i 个函数是 make.adder(i)?

最佳答案

我认为您需要使用 force() 来确保参数在您期望的时候被评估。有关详细信息,请参阅 ?force ...

make.adder <- function(a) { force(a); function(x) {x + a}}
s <- list(1, 2)
adders <- lapply(s, make.adder)

adders[[1]](1) ## 2

关于R 函数闭包环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714111/

相关文章:

r - R 中的 float 小于或等于

r - 绘制 R 中两个有序列表之间排名变化的最简单方法?

python - 了解闭包在装饰器和函数包装器参数中的作用

performance - Environment.Clone 窃取启动时间

r - 如何禁用 knitr 图中的透明度?

mysql - 如何在 Windows 7 上安装 RMySQL 包

unit-testing - 使用 Groovy 模拟 Jenkins 管道

groovy - Spock - 模拟 Groovy 闭包方法?

api - 我应该为使用我的图书馆的人默认环境吗?

c - 用 Visual Studio 2017 编写的程序可以在 Linux 或 Unix 环境中运行吗?