R懒惰评估-不起作用

贝琳达

我玩了高级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
G.格洛腾迪克

在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

使用R 3.2.0之前的版本进行演示

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章