Можете ли вы более четко объяснить ленивую оценку в операторах 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
родом из? Как ленивая оценка работает под капотом в этом примере?
-
РЕДАКТИРОВАТЬ: Я в курседругой вопрос о ленивых вычислениях и функционалах, но он просто говорит, что ответом является «ленивая оценка» без объяснения того, как на самом деле работает ленивая оценка. Я ищу большую глубину.