我正在閱讀Hadley Wickhams在Github上的書,特別是this part on lazy evaluation。在那裏他給出了懶惰評價的後果的一個例子,在add/adders
函數的部分。讓我引用這一點:你所說的加法器 之一解釋一個懶惰的評價怪癖
add <- function(x) {
function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
x被懶洋洋地評估的第一次:
這[懶評測]創建與lapply關閉或循環時是非常重要的功能。在這一點上,循環完成,並且最終的值爲10。因此,所有的加法器函數都會在它們的 輸入上加10,可能不是你想要的!手動強制評估修復 問題:
add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10)
我似乎不明白位,並且說明有最小。有人可以詳細說明這個特定的例子,並解釋發生了什麼?我特別困惑於這句話:「在這一點上,循環完成,x的最終值爲10」。什麼循環?什麼終極價值在哪裏?一定是我想念的東西,但我只是沒有看到它。提前致謝。
注意的是,這個問題的答案已經改變爲R 3.2.0,請參閱我的回答如下。 – jhin 2015-06-08 09:09:20
對@ jhin的評論的補充:儘管'lapply()'在最近的R中已經發生了變化,但是旨在用於lapply()的任何地方的函數'purrr :: map()'仍然像舊的' lapply()'相對於閉包的共享環境。然而,我不會指望'purrr :: map()'這個「不合時宜」,因爲它可能會在未來的版本中被糾正。 – egnha 2016-10-21 16:31:28
@jhin其實,我猜哈德利的教程是直接從github構建的,所以在R 3.2.0之後閱讀它現在非常怪異,因爲該版本在整個教程中對懶惰評估進行了部分介紹:與加法器沒有多大區別, adders2的輸出! – 2016-12-23 23:13:55