我使用高级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
答案 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
将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