Explique uma peculiaridade de avaliação preguiçosa
Eu estou lendo o livro de Hadley Wickhams no Github, em particularesta parte na avaliação preguiçosa. Lá ele dá um exemplo das conseqüências da avaliação preguiçosa, na parte comadd/adders
funções. Deixe-me citar esse bit:
Isso [avaliação lenta] é importante ao criar closures com lapply ou loop:
add <- function(x) {
function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
x é avaliado preguiçosamente na primeira vez que você chama uma das funções somador. Neste ponto, o loop está completo e o valor final de x é 10. Portanto, todas as funções somador adicionarão 10 à sua entrada, provavelmente não o que você queria! Forçar manualmente a avaliação corrige o problema:
add <- function(x) {
force(x)
function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)
Eu não pareço entender isso, e a explicação é mínima. Alguém poderia, por favor, elaborar esse exemplo específico e explicar o que acontece lá? Estou especificamente confuso com a frase "neste ponto, o loop está completo e o valor final de x é 10". Qual laço? Qual o valor final, onde? Deve ser algo simples Estou perdendo, mas eu simplesmente não vejo isso. Muito obrigado antecipadamente.