我的程序的以下简化版本捕获了混乱。
我正在尝试创建一组函数f1, f2, ..., fK, ..., fn定义为fK(x) = print(K + x)。为此,我创建了函数工厂:
factory = function (K) {
function (x) print(K + x)
}
并用它来创建 5 个函数:funcs = sapply(1:5, factory)
我一一称它们为相同的值:x = 10
callOnef = function (f, x) f(x)
sapply(funcs, callOnef, 10)
我预计输出是(每行一个)11 12 13 14 15,但我得到了(每行一个)15 15 15 15 15 和第 6 行,一行五个15。
print(K)
当我在 的定义中插入 a时factory
,输出更改为(每行一个)11 12 13 14 15 和第 6 行,一行11 12 13 14 15。(忽略 6 行之前的 print(K) 本身的输出)
这让我很困惑。我找到了一个有建议使用的线程force
。
所以,我替换print(K)
为force(K)
:
factory = function (K) {
force(K)
function (x) print(K + x)
}
现在的输出是(每行一个)11 12 13 14 15 和第 6 行,一行11 12 13 14 15。
问题:
- 为什么对 K 的评估(例如在我的情况下通过
print(K)
orforce(K)
,)会改变闭包的行为? - 为什么是第 6 行?如果K 是等于1:5的向量,它看起来与 print(K + 10) 的输出相同。