Tôi đang đọc cuốn sách của Hadley Wickhams về Github, cụ thể là this part on lazy evaluation. Ở đó, ông đưa ra một ví dụ về hậu quả của việc đánh giá lười biếng, một phần với chức năng add/adders
. Hãy để tôi trích đoạn mà bit:Giải thích một câu hỏi đánh giá lười biếng
này [lười biếng đánh giá] là rất quan trọng khi tạo đóng cửa với lapply hoặc một vòng lặp:
add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10)
x là lười biếng đánh giá lần đầu tiên bạn gọi một trong những bộ cộng chức năng. Tại thời điểm này, vòng lặp hoàn tất và giá trị cuối cùng của x là 10. Vì vậy, tất cả các hàm cộng sẽ thêm 10 vào đầu vào của chúng, có thể không phải là những gì bạn muốn! Bằng tay buộc sửa thẩm vấn đề:
add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10)
Tôi dường như không hiểu rằng chút, và lời giải thích có là tối thiểu. Ai đó có thể vui lòng xây dựng ví dụ cụ thể đó và giải thích điều gì sẽ xảy ra ở đó? Tôi đặc biệt bối rối bởi câu "tại thời điểm này, vòng lặp hoàn tất và giá trị cuối cùng của x là 10". Vòng lặp gì? Giá trị cuối cùng, ở đâu? Phải là một cái gì đó đơn giản tôi đang mất tích, nhưng tôi chỉ không nhìn thấy nó. Cảm ơn rất nhiều trước.
Lưu ý rằng câu trả lời cho câu hỏi này đã thay đổi như của R 3.2.0, xem câu trả lời của tôi dưới đây. – jhin
Bổ sung cho nhận xét của jhin: Trong khi 'lapply()' đã thay đổi trong R gần đây, hàm 'purrr :: map()', được sử dụng ở bất cứ nơi nào 'lapply()', vẫn hoạt động như cũ ' lapply() 'vis-à-vis môi trường chia sẻ của bao đóng. Tuy nhiên, tôi sẽ không dựa vào "lỗi thời" này của 'purrr :: map()' để gắn bó xung quanh, vì nó có thể sẽ được sửa chữa trong các phiên bản sau. – egnha
@jhin Trên thực tế, tôi đoán hướng dẫn của hadley được xây dựng trực tiếp từ github để đọc nó sau khi R 3.2.0 bây giờ khá kì lạ khi bản phát hành đó đưa ra toàn bộ phần về đánh giá lười biếng trong hướng dẫn đó: không có sự khác biệt nào với 'adders' và Kết quả đầu ra 'adders2'! –