【发布时间】:2018-06-05 14:05:46
【问题描述】:
当我循环将函数包装在列表中时,输入列表中的最后一个函数始终用于所有包装调用。
wrapper <- function(f)function()f()
fs <- list(f = function()"call f", g = function()"call g")
ws <- list()
for(n in names(fs))
ws[[n]] <- wrapper(fs[[n]])
ws$f()
[1] "call g"
我在上面的代码中期望"call f",但实际上它返回了"call g"。
谁能解释一下为什么会这样?
标志是什么,或者在什么情况下我必须强制评估以避免类似情况
非常感谢
【问题讨论】:
-
我怀疑罪魁祸首是懒惰的评价。尝试在你现在的代码之前在你的循环中使用
force(n)。 -
奇怪的是,
ws <- lapply(fs, wrapper); ws$f()有效 -
@alistaire AFAIK,
lapply对列表的每个元素执行force。虽然我的循环没有 -
@Dason:
force(n)在循环中 not 工作。force(f)在wrapper工作,而不是
标签: r functional-programming lazy-evaluation