我想知道R是如何处理延迟评估的。
我在阅读Hadley Wickham的AdvancedR部分后就问这个问题......
在他的网站上(见http://adv-r.had.co.nz/Functions.html),加法器和加法器2给出了相同的结果,所以我猜想R处理延迟评估的方式发生了变化(最近?)。
下面,我的意思是可重复的例子:
add <- function(x) {
function(y) x + y
}
add2 <- function(x) {
force(x)
function(y) x + y
}
adders <- lapply(1:10, add)
adders2 <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
adders2[[1]](10)
adders2[[10]](10)
从历史上看,我们原本希望得到:
> adders[[1]](10)
[1] 20
> adders[[10]](10)
[1] 20
> adders2[[1]](10)
[1] 11
> adders2[[10]](10)
[1] 20
但是,在我的电脑上(以及在Hadley的网站上),结果是:
> adders[[1]](10)
[1] 11
> adders[[10]](10)
[1] 20
> adders2[[1]](10)
[1] 11
> adders2[[10]](10)
[1] 20
在我的计算机上,R.Version()
给出:
> R.Version()
$platform
[1] "x86_64-apple-darwin13.4.0"
$arch
[1] "x86_64"
$os
[1] "darwin13.4.0"
$system
[1] "x86_64, darwin13.4.0"
$status
[1] ""
$major
[1] "3"
$minor
[1] "2.0"
$year
[1] "2015"
$month
[1] "04"
$day
[1] "16"
$`svn rev`
[1] "68180"
$language
[1] "R"
$version.string
[1] "R version 3.2.0 (2015-04-16)"
$nickname
[1] "Full of Ingredients"