Почему ленивая оценка не нарушает этот код? - PullRequest
0 голосов
/ 03 октября 2018
add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)

В приведенном выше коде Уикхем заявляет в Advanced R , что, поскольку аргументы функции лениво оцениваются, x будет равно 10 для всех замыканий, созданных lapply (1:10, add).Но это не тот случай, когда я запустил код в сеансе R, но даже его примеры, насколько я могу судить, не демонстрируют нарушения вышеприведенного кода - почему это так?

1 Ответ

0 голосов
/ 03 октября 2018

Один из комментариев уже ответил на вопрос: lapply был изменен, чтобы иметь поведение, отличное от того, что написал Уикхем в то время.

Если вы хотите углубиться в это, вот разработка Rветка электронной почты, где это было изменено: https://stat.ethz.ch/pipermail/r-devel/2015-February/070686.html

А вот Хэдли Уикхем обсуждает, как пример будет исправлен в следующей версии Advanced R : https://github.com/hadley/adv-r/issues/803

...