R懒惰评估 - 不工作

时间:2018-05-30 14:46:37

标签: r lazy-evaluation

我使用高级R示例http://adv-r.had.co.nz/Functions.html 并得到不同的结果。根据这本书,R懒惰评估是默认的。但对我来说,它似乎被关闭了。为什么这样以及如何解决它?

我得到了什么:

add <- function(x) {
    function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
[1] 11    **The book gave 20 instead of 11**
adders[[10]](10)
[1] 20

1 个答案:

答案 0 :(得分:3)

在R 3.2.0中,这一变化是对R:

  

高阶函数,例如apply函数和Reduce()   强制论证它们适用的函数以消除   惰性评估和变量捕获之间的不良交互   在关闭。这解决了PR#16093。

这可以在以下的R 3.2.0部分找到:

https://cran.r-project.org/doc/manuals/r-devel/NEWS.html

另见:

https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16093

使用3.2.0之前版本的R

进行演示

force添加到问题中的代码将导致3.2.0之前的R与3.2.0相同。

使用R 3.1.3,我们可以使用force而不使用force来显示差异:

R.version.string
## [1] "R version 3.1.3 Patched (2015-03-16 r68169)"

# adding force to the code in the question
# In R 3.2.0 onwards conceptually R acts as if this R 3.1.3 code were run
add <- function(x) {
    force(x)  # <---------------------------
    function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
## [1] 11

# not using force, i.e. using identical code as in the question
add <- function(x) {
    function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
## [1] 20