我玩了高级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
在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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句