Se creo una funzione come segue:Puoi spiegare più chiaramente la valutazione pigra negli operatori di funzioni R?
what_is_love <- function(f) {
function(...) {
cat('f is', f, '\n')
}
}
e chiamarlo con lapply
: funs <- lapply(c('love', 'cherry'), what_is_love)
ottengo uscita inaspettata:
> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry
Ma si noti che questo non è il caso quando si non utilizzare lapply
:
> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry
Cosa dà?
so che funs <- lapply(c('love', 'cherry'), what_is_love)
può essere scritto in maniera più completa:
params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
out[[i]] <- what_is_love(params[[i]])
}
out
Ma quando navigo in, vedo che le due funzioni hanno il proprio ambiente:
Browse[1]> out[[1]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x109508478>
Browse[1]> out[[2]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x1094ff750>
Ma in ciascuno di tali ambienti, f
è lo stesso ...
Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"
I kno w la risposta è "lazy evaluation", ma sto cercando un po 'più di profondità ... in che modo lo f
viene ri-assegnato in entrambi gli ambienti? Da dove proviene f
? In che modo la valutazione Razy funziona sotto il cofano in questo esempio?
-
EDIT: Sono consapevole di the other question sulla valutazione pigro e funzionali, ma si dice solo la risposta è "valutazione pigra" senza spiegare come la valutazione pigra funziona realmente. Sto cercando una maggiore profondità.
possibile duplicato di [spiegare un pigro capriccio di valutazione] (http://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk) – jangorecki
lapply non è più comportamenti in questo modo in R-3.2. 0. –