返回R中的函数 - 何时发生绑定?

时间:2015-05-16 13:59:54

标签: r function functional-programming lazy-evaluation

与其他函数式语言一样,返回函数是R中的常见情况,例如,在训练模型后,您希望返回一个“预测器”对象,它本质上是一个函数,给定新数据,返回预测。当然,在其他情况下这很有用。

我的问题是返回函数中值的绑定(例如评估)何时发生。

作为一个简单的例子,假设我想要一个包含三个函数的列表,每个函数根据我在创建函数时设置的值的参数略有不同。这是一个简单的代码:

function.list = list()
for (i in 1:3) function.list[[i]] = function(x) x+i

所以现在我有三个功能。理想情况下,第一个返回x + 1,第二个计算x + 2,第三个计算x + 3

所以我希望:

function.list[[1]] (3) = 4
function.list[[2]] (3) = 5

不幸的是,这不会发生,并且上面列表中的所有函数都计算相同的x + 3。我的问题是为什么?为什么i的值的绑定是如此晚,因此对于列表中的所有函数都是一样的?我该如何解决这个问题?

编辑: rawr与类似问题的链接很有见地,我认为它解决了这个问题。链接在这里: Explain a lazy evaluation quirk

但是,我检查了上面给出的代码,并在那里提出了修复,但它仍然无效。当然,我想念一些非常基本的东西。任何人都可以告诉我它是什么?这是“固定”代码(仍然不起作用)

function.list = list()
for (i in 1:3) { force(i); function.list[[i]] = function(x) x+i}

仍然是function.list [[1]](3)按预期给出6而不是4。 我也尝试了以下方法(例如将force()放在函数中)

function.list = list()
for (i in 1:3) function.list[[i]] = function(x) {force(i);x+i}

发生了什么事?

1 个答案:

答案 0 :(得分:0)

以下是使用R 3.1的<{1}}循环解决方案:

for

> makeadd=function(i){force(i);function(x){x+i}} > for (i in 1:3) { function.list[[i]] = makeadd(i)} > rm(i) # not necessary but causes errors if we're actually using that `i` > function.list[[1]](1) [1] 2 > function.list[[2]](1) [1] 3 函数在具有本地makeadd的上下文中创建添加函数,这就是为什么这样做的原因。如果没有R 3.2中的i,这将是有用的。我总是使用武力,卢克......