Você pode explicar mais claramente a avaliação preguiçosa em operadores de função R?
Se eu criar uma função da seguinte maneira:
what_is_love <- function(f) {
function(...) {
cat('f is', f, '\n')
}
}
E chame comlapply
: funs <- lapply(c('love', 'cherry'), what_is_love)
Recebo uma saída inesperada:
> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry
Mas observe que esse não é o caso quando você não usalapply
:
> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry
O que da?
Eu sei dissofuns <- lapply(c('love', 'cherry'), what_is_love)
pode ser escrito mais completamente:
params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
out[[i]] <- what_is_love(params[[i]])
}
out
Mas quando navego, vejo que ambas as funções têm seu próprio 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>
Mas em cada um desses ambientes,f
é o mesmo...
Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"
Eu sei que a resposta é "avaliação preguiçosa", mas estou procurando um pouco mais de profundidade ... como é quef
acabar redesignado nos dois ambientes? Ondef
vem de onde? Como a avaliação lenta do R funciona sob o capô neste exemplo?
-
EDITAR: Estou ciente dea outra pergunta na avaliação preguiçosa e nos funcionais, mas apenas diz que a resposta é "avaliação preguiçosa" sem explicar como a avaliação preguiçosa realmente funciona. Estou buscando maior profundidade.