R处理懒惰评估的方式有什么变化吗?

时间:2015-08-07 11:22:30

标签: r lazy-evaluation

我想知道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"

0 个答案:

没有答案