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.

questionAnswers(1)

yourAnswerToTheQuestion