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



与其他函数式语言一样,在r中返回一个函数是一种常见的情况。例如,在训练了一个模型之后,您想要返回一个"predictor"对象,它本质上是一个函数,给定新数据,返回预测。当然,在其他情况下,这也很有用。

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

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

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与一个类似问题的链接很有见地,我认为它解决了问题。链接如下:解释一个延迟求值的怪癖

然而,我检查了我上面给出的代码,并在那里建议修复,它仍然不起作用。当然,我在这里漏掉了一些非常基本的东西。有人能告诉我是什么吗?这里是"固定"的代码(仍然不起作用)
function.list = list()
for (i in 1:3) { force(i); function.list[[i]] = function(x) x+i}

仍然功能。列表[[1]](3)给出6,而不是预期的4。我还尝试了以下方法(例如将force()放入函数中)

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

怎么回事?

下面是使用r3.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函数在具有本地i的上下文中创建了添加函数,这就是为什么它工作的原因。这将是有趣的知道如果没有force在R 3.2中工作。我总是使用force, Luke....

最新更新