这是我创建的一个测试函数,用于了解lapply
和闭包如何交互。我的目标是依次遍历runif
函数并打印每个迭代。闭包的执行顺序
Mod_delay_by <- function(delay,f){
function(x,...){
Sys.sleep(delay)
cat(".")
#f(x,...)
cat("Processing",x,"\n",sep = "")
f(x,...)
}
}
现在让我们使用lapply
上面的函数调用:
lapply(1:3,Mod_delay_by(0.1,runif))
当我致电上述功能,我得到下面的示例输出:
.Processing1
.Processing2
.Processing3
[[1]]
[1] 0.835246
[[2]]
[1] 0.1370997 0.4350032
[[3]]
[1] 0.1174749 0.4087628 0.7222604
我很惊讶,因为所有三个“处理”在执行runif
之前出现。相反,我本来期望的输出是...
.Processing1
[[1]]
[1] 0.835246
.Processing2
[[2]]
[1] 0.1370997 0.4350032
.Processing3
[[3]]
[1] 0.1174749 0.4087628 0.7222604
...因为runif
(即功能f
)立即通过调用“.Processing”开头
是否有人可以解释为什么lapply
首先完成打印全部三个Processing
,然后打印全部三个runifs
?
在此先感谢您的帮助。
'lapply'汇编函数返回的任何东西(最后一行,除非你使用显式的'return'语句)并返回它。 '猫'调用是副作用,因此在调用时会被打印,而不是返回匿名函数(当返回的对象被'lapply'存储时)或'lapply'完成时(当它将所有结果组装到一个列表中并返回它,如果未分配则导致它打印)。 – alistaire