Sto leggendo il libro di Hadley Wickhams su Github, in particolare this part on lazy evaluation. Lì fornisce un esempio di conseguenze della valutazione lazy, nella parte con le funzioni add/adders
. Permettetemi di citare quel po ':Spiegare una piccola curiosità di valutazione
Questo [valutazione pigra] è importante per la creazione di chiusure con lapply o un ciclo:
add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10)
x è pigramente valutata la prima volta che si chiama uno dei vipera funzioni. A questo punto, il ciclo è completo e il valore finale di x è 10. Quindi tutte le funzioni di aggiunta aggiungeranno 10 al loro input , probabilmente non quello che volevi! costringendo manualmente correzioni di valutazione il problema:
add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10)
non mi sembra di capire che po ', e la spiegazione non v'è il minimo. Qualcuno potrebbe per favore elaborare quel particolare esempio e spiegare cosa succede lì? Sono particolarmente perplesso dalla frase "a questo punto, il ciclo è completo e il valore finale di x è 10". Quale ciclo? Quale valore finale, dove? Deve essere qualcosa di semplice che mi manca, ma semplicemente non lo vedo. Grazie mille in anticipo.
Nota che la risposta a questa domanda è cambiata di R 3.2.0, vedere la mia risposta qui sotto. – jhin
Complementare al commento di @jhin: Mentre 'lapply()' è cambiato nella recente R, la funzione 'purrr :: map()', che deve essere usata ovunque 'lapply()', si comporta ancora come la vecchia ' lapply() 'vis-à-vis con ambienti condivisi di chiusure. Tuttavia, non conterei su questo "anacronismo" di 'purrr :: map()' da aggirare, poiché sarà probabilmente corretto nelle versioni future. – egnha
@jhin In realtà, immagino che il tutorial di hadley sia stato creato direttamente da github in modo da leggerlo dopo che la R 3.2.0 è abbastanza bizzarra dato che questa versione ha reso l'intera sezione sulla valutazione lazy in quel tutorial moot: non c'è più differenza con 'adders' e Uscite di 'adders2'! –