Wyjaśnij dziwaczną ocenę
W szczególności czytam książkę Hadleya Wickhamsa o Githubieta część leniwej oceny. Tam podaje przykład konsekwencji leniwej oceny, w części zadd/adders
Funkcje. Pozwólcie, że zacytuję ten fragment:
Ta [leniwa ocena] jest ważna przy tworzeniu zamknięć za pomocą lapply lub pętli:
add <- function(x) {
function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
x jest leniwie oceniany przy pierwszym wywołaniu jednej z funkcji sumatora. W tym momencie pętla jest kompletna, a końcowa wartość x wynosi 10. Dlatego wszystkie funkcje sumatora dodadzą 10 do swoich danych wejściowych, prawdopodobnie nie tego, czego chcesz! Ręczne wymuszanie oceny rozwiązuje problem:
add <- function(x) {
force(x)
function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)
Wydaje mi się, że nie rozumiem tego, a wyjaśnienie tam jest minimalne. Czy ktoś mógłby opracować ten konkretny przykład i wyjaśnić, co się tam dzieje? Zdumiewa mnie zdanie „w tym momencie pętla jest kompletna, a końcowa wartość x wynosi 10”. Jaka pętla Jaka jest ostateczna wartość? To musi być coś prostego, którego mi brakuje, ale po prostu tego nie widzę. Z góry dziękuję.