¿Puede explicar más claramente la evaluación diferida en los operadores de función R?

Si creo una función de la siguiente manera:

what_is_love <- function(f) {
  function(...) {
    cat('f is', f, '\n')
  }
}

Y llámalo conlapply: funs <- lapply(c('love', 'cherry'), what_is_love)

Obtengo resultados inesperados:

> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry

Pero tenga en cuenta que este no es el caso cuando no utilizalapply:

> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry

¿Lo que da?

Yo sé esofuns <- lapply(c('love', 'cherry'), what_is_love) se puede escribir más completamente:

params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
  out[[i]] <- what_is_love(params[[i]])
}
out

Pero cuando navego, veo que ambas funciones tienen su propio entorno:

Browse[1]> out[[1]]
function(...) {
    cat('f is', f, '\n')
  }
<environment: 0x109508478>
Browse[1]> out[[2]]
function(...) {
    cat('f is', f, '\n')
  }
<environment: 0x1094ff750>

Pero en cada uno de esos entornos,f es el mismo...

Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"

Sé que la respuesta es "evaluación perezosa", pero estoy buscando un poco más de profundidad ... ¿cómof terminar reasignado en ambos entornos? Donde hacef ¿viene de? ¿Cómo funciona la evaluación perezosa de R bajo el capó en este ejemplo?

-

EDITAR: Soy consciente dela otra pregunta en evaluación diferida y funcional, pero solo dice que la respuesta es "evaluación diferida" sin explicar cómo funciona realmente la evaluación diferida. Estoy buscando mayor profundidad.

Respuestas a la pregunta(1)

Su respuesta a la pregunta