Я читаю книгу Хэдли Уикхэма на Github, в частности эту часть на ленивую оценку. Там он приводит пример последствий ленивой оценки в части с функциями add/adders
. Позвольте мне процитировать этот бит:
Эта [ленивая оценка] важна при создании замыканий с помощью лаппеля или цикла:
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". Какой цикл? Какое окончательное значение, где? Должно быть, что-то простое, что мне не хватает, но я просто этого не вижу. Большое спасибо заранее.