【发布时间】:2015-07-28 09:16:21
【问题描述】:
与其他函数式语言一样,返回函数是 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}
Still function.list[[1]] (3) 给出了 6 而不是 4 的预期。 我还尝试了以下方法(例如将 force() 放入函数中)
function.list = list()
for (i in 1:3) function.list[[i]] = function(x) {force(i);x+i}
发生了什么事?
【问题讨论】:
-
这是一个笨办法:
for (i in 1:3) function.list[[i]] = eval(substitute(function(x) x+i,list(i=i))) -
正如@rawr 所说,这是完全重复的。
-
@rawr 谢谢。这正是我想要的。
-
@rawr 好的,检查了您提供的链接上建议的解决方案,但在我的情况下它仍然不起作用。请参阅编辑后的问题了解我遇到的问题和我尝试过的代码。
标签: r function functional-programming lazy-evaluation