Объясните ленивую причуду оценки
Я читаю книгу Хэдли Уикхемса о Github, в частностиэта часть о ленивой оценке, Там он приводит пример последствий ленивой оценки, в части сadd/adders
функции. Позвольте мне процитировать этот бит:
Эта [ленивая оценка] важна при создании замыканий с lapply или циклом:
add <- function(x) {
function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
x лениво вычисляется при первом вызове одной из функций сумматора. На этом этапе цикл завершен, и конечное значение x равно 10. Поэтому все функции сумматора добавят 10 к своему входу, вероятно, не то, что вы хотели! Ручная принудительная оценка устраняет проблему:
add <- function(x) {
force(x)
function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)
Кажется, я этого не понимаю, и объяснение здесь минимальное. Может ли кто-нибудь разработать этот конкретный пример и объяснить, что там происходит? Я определенно озадачен предложением "на этом этапе цикл завершен, и окончательное значение x равно 10" Какая петля? Какое окончательное значение, где? Должно быть что-то простое, что мне не хватает, но я просто не вижу этого. Заранее большое спасибо.