Nhận xét của NiceE và câu trả lời của Sosel đã giải quyết vấn đề này; khi gọi số source(file)
, giá trị mặc định là source(file, local = FALSE)
, có nghĩa là mã trong tệp có nguồn gốc được đánh giá trong môi trường toàn cầu ("không gian làm việc của người dùng") và có, cf. ?source
. Lưu ý rằng không có biến số i
trong môi trường toàn cầu. Giải pháp là đảm bảo tệp có nguồn gốc trong môi trường gọi là tệp, tức là sử dụng source(file, local = TRUE)
.
Giải pháp:
library("foreach")
y <- foreach(i = 1:2) %dopar% {
i + 2
}
str(y)
doMC::registerDoMC(cores = 2L)
y <- foreach(i = 1:2) %dopar% {
source("addition.R", local = TRUE)
}
str(y)
Ví dụ về cùng một vấn đề với một vòng lặp for()
:
Thực tế là source()
được đánh giá trong môi trường toàn cầu mà là khác nhau từ môi trường gọi nơi i
cuộc sống cũng có thể được được minh họa bằng cách sử dụng vòng lặp thông thường bằng cách chạy vòng lặp for trong môi trường khác so với toàn cục, ví dụ bên trong một hàm hoặc bằng cách:
local({
for(i in 1:2) {
source("addition.R")
}
})
mang đến cho:
Error in eval(ei, envir) : object 'i' not found
Bây giờ, lý do tại sao trên foreach(i = 1:2) %dopar% { source("addition.R") }
làm việc với registerDoSEQ()
khi và chỉ khi gọi từ môi trường toàn cầu, đó là sau đó các foreach iteration được đánh giá trong môi trường gọi, đó là môi trường toàn cầu, đó là môi trường mà sử dụng source()
. Tuy nhiên, nếu sử dụng local(foreach(i = 1:2) %dopar% { ... })
thì việc này cũng không tương tự với cuộc gọi local(for(i in 1:2) { ... })
ở trên.
Kết luận: không có phép thuật nào xảy ra, nhưng để hiểu nó hơi tẻ nhạt.
Hãy thử 'nguồn ("addtition.R", local = T) 'để đánh giá nguồn trong envronment mà nó được gọi là – NicE
Tôi tìm thấy nguồn() gọi trong% dopar% khối làm chậm đáng kể tính toán, như các tiến trình con phải lấy tệp nguồn đó thông qua mạng –