Je suis en train de lire le livre de Hadley Wickhams sur Github, en particulier cette partie sur l'évaluation paresseuse . Il y donne un exemple des conséquences d'une évaluation paresseuse, dans la partie avec add/adders
fonctions. Permettez-moi de citer ce passage :
Cette [évaluation paresseuse] est importante lors de la création de fermetures avec lapply ou une boucle :
add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10)
x est évaluée paresseusement la première fois que vous appelez l'un des adder de l'additionneur. A ce stade, la boucle est terminée et la valeur finale de x est 10. Par conséquent, toutes les fonctions d'addition ajouteront 10 à leur valeur finale. entrée, ce qui n'est probablement pas ce que vous souhaitiez ! Le fait de forcer manuellement l'évaluation résout le problème :
add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10)
Je n'ai pas l'impression de comprendre cette partie, et l'explication est minimale. Quelqu'un pourrait-il développer cet exemple particulier et expliquer ce qui se passe ? La phrase "à ce stade, la boucle est terminée et la valeur finale de x est 10" me laisse particulièrement perplexe. Quelle boucle ? Quelle valeur finale, où ? Il doit y avoir quelque chose de simple qui m'échappe, mais je ne le vois pas. Merci beaucoup d'avance.
3 votes
Notez que la réponse à cette question a changé à partir de R 3.2.0, voir ma réponse ci-dessous.
0 votes
Complément au commentaire de @jhin : Bien que
lapply()
a changé au cours des dernières années, la fonctionpurrr::map()
qui est destiné à être utilisé partout oùlapply()
se comporte toujours comme l'ancienlapply()
vis-à-vis des environnements partagés de fermetures. Toutefois, je ne compterais pas sur cet "anachronisme" de la part de la Commission européenne.purrr::map()
de rester dans le coin, car il sera probablement corrigé dans les prochaines versions.0 votes
@jhin En fait, je suppose que le tutoriel de hadley est construit directement à partir de github, donc le lire après la version 3.2.0 de R est maintenant assez bizarre car cette version a rendu inutile toute la section sur l'évaluation paresseuse dans ce tutoriel : il n'y a plus de différence avec
adders
yadders2
Les sorties de l'entreprise !