Nếu tôi tạo một hàm như sau:Bạn có thể giải thích rõ hơn về đánh giá lười biếng trong các toán tử hàm R không?
what_is_love <- function(f) {
function(...) {
cat('f is', f, '\n')
}
}
Và gọi nó với lapply
: funs <- lapply(c('love', 'cherry'), what_is_love)
tôi nhận được kết quả bất ngờ:
> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry
Nhưng lưu ý rằng đây không phải là trường hợp khi bạn không sử dụng lapply
:
> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry
Điều gì mang lại?
Tôi biết rằng funs <- lapply(c('love', 'cherry'), what_is_love)
có thể được viết ra đầy đủ hơn:
params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
out[[i]] <- what_is_love(params[[i]])
}
out
Nhưng khi tôi duyệt trong, tôi thấy rằng cả hai chức năng có môi trường riêng của họ:
Browse[1]> out[[1]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x109508478>
Browse[1]> out[[2]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x1094ff750>
Nhưng trong mỗi người môi trường, f
là giống nhau ...
Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"
Tôi kno w câu trả lời là "đánh giá lười biếng", nhưng tôi đang tìm kiếm một chút sâu hơn ... làm thế nào để f
kết thúc lại được giao trên cả hai môi trường? Trường hợp nào f
đến từ đâu? Làm thế nào để đánh giá lười biếng R làm việc dưới mui xe trong ví dụ này?
-
EDIT: Tôi nhận thức được the other question trên đánh giá lười biếng và functionals, nhưng nó chỉ cho biết câu trả lời là "lười biếng đánh giá" mà không giải thích như thế nào đánh giá lười biếng thực sự hoạt động. Tôi đang tìm kiếm chiều sâu hơn.
thể trùng lặp của [Giải thích một đứa lười biếng đánh giá] (http://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk) – jangorecki
lapply không còn hành vi nào theo cách này trong R-3.2. 0. –