Можете ли вы более четко объяснить ленивую оценку в операторах R-функций?

Если я создаю функцию следующим образом:

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

И позвони сlapply: funs <- lapply(c('love', 'cherry'), what_is_love)

Я получаю неожиданный вывод:

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

Но обратите внимание, что это не тот случай, когда вы не используетеlapply:

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

Что дает?

я знаю этоfuns <- lapply(c('love', 'cherry'), what_is_love) можно выписать более полно:

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

Но когда я захожу, я вижу, что обе функции имеют свою собственную среду:

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

Но в каждой из этих сред,f та же...

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

Я знаю, что ответ "ленивая оценка", но я ищу немного больше глубины ... какf в конечном итоге переназначается в обеих средах? Где жеf родом из? Как ленивая оценка работает под капотом в этом примере?

-

РЕДАКТИРОВАТЬ: Я в курседругой вопрос о ленивых вычислениях и функционалах, но он просто говорит, что ответом является «ленивая оценка» без объяснения того, как на самом деле работает ленивая оценка. Я ищу большую глубину.

Ответы на вопрос(1)

Ваш ответ на вопрос