为了账号安全,请及时绑定邮箱和手机立即绑定

解释一个懒惰的评价怪癖

解释一个懒惰的评价怪癖

MMMHUHU 2019-07-30 16:40:16
解释一个懒惰的评价怪癖我正在阅读Hadley Wickhams关于Github的书,特别是关于懒惰评估的这一部分。在那里,他举例说明了懒惰评估的后果,在有add/adders功能的部分。让我引用一下:在使用lapply或循环创建闭包时,[懒惰评估]很重要:add <- function(x) {   function(y) x + y}adders <- lapply(1:10, add)adders[[1]](10)adders[[10]](10)在第一次调用其中一个加法器函数时,会对x进行延迟计算。此时,循环完成,x的最终值为10.因此,所有加法器函数都会在其输入上添加10,可能不是您想要的!手动强制评估修复了问题:add <- function(x) {   force(x)   function(y) x + y}adders2 <- lapply(1:10, add)adders2[[1]](10)adders2[[10]](10)我似乎不明白那一点,而且那里的解释很少。有人可以详细说明这个特定的例子,并解释那里发生了什么?我特别对句子感到困惑“此时,循环完成,x的最终值为10”。什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它。非常感谢提前。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

从R 3.2.0开始,这已不再适用!

更改日志中的相应行显示:

诸如apply函数和Reduce()之类的高阶函数现在强制它们应用的函数的参数,以便消除惰性求值和闭包中的变量捕获之间的不期望的交互。

事实上:

add <- function(x) {

  function(y) x + y

}

adders <- lapply(1:10, add)

adders[[1]](10)

# [1] 11

adders[[10]](10)

# [1] 20


查看完整回答
反对 回复 2019-07-30
  • 2 回答
  • 0 关注
  • 502 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信