我正在读哈德利·威克汉姆关于Github的书,尤其是this part on lazy evaluation本.在这一部分中,他给出了一个懒惰判断结果的示例,其中包含add/adders个函数.让我引用这一点:

在使用lappy或循环创建闭包时,此[延迟判断]非常重要:

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)

当你第一次调用其中一个加法器时,x被惰性地计算出来

add <- function(x) {
  force(x)
  function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)

我似乎不明白这一点,而且解释也很少.有人能详细说明一下这个例子,并解释一下那里发生了什么吗?我对"此时,循环已完成,x的最终值为10"这句话感到特别困惑.什么回路?什么是最终价值,在哪里?一定是我错过了一些简单的东西,但我就是看不到.非常感谢.

推荐答案

目标是:

adders <- lapply(1:10, function(x)  add(x) )

就是创建一个包含add个函数的列表,第一个函数向其输入中添加1,第二个函数向其输入中添加2,等等.延迟求值会导致R等待真正创建加法器函数,直到您真正开始调用这些函数.问题是,在创建第一个加法器函数后,xlapply循环增加,最终值为10.当您调用第一个加法器函数时,惰性求值现在构建该函数,得到x的值.问题是,原来的x不再等于1,而是等于lapply循环末尾的值,即10.

因此,延迟计算会导致所有加法器函数等到lapply循环完成后才真正构建函数.然后它们以相同的值构建它们的函数,即10.Hadley建议的解决方案是直接强制x求值,避免懒惰求值,并使用正确的x值获得正确的函数.

R相关问答推荐

R包terra在投影时如何决定模板格栅属性?

在水平条形图中zoom x_轴

提取rame中对应r中某个变量的n个最小正值和n个最大负值的条目

从有序数据中随机抽样

R箱形图gplot 2 4组但6个参数

gt()从gt为相同内容的单元格 colored颜色 不同?

在R中替换函数中的特定符号

如何在Chart_Series()中更改轴值的 colored颜色 ?

如何从R ggplot图片中获取SVG字符串?

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

使用带有OR条件的grepl过滤字符串

将二进制数据库转换为频率表

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

TreeNode打印 twig 并为其上色

在保留列表元素属性的同时替换列表元素

R -基线图-图形周围的阴影区域

防止正则表达式覆盖以前的语句

用满足特定列匹配的另一行替换NA行

R-找出存在其他变量的各种大小的所有组合

在GT()中的列之间添加空格