Komentarz NiceE i odpowiedź Sosel już to rozwiązują; przy wywołaniu source(file)
domyślnie jest to source(file, local = FALSE)
, co oznacza, że kod źródłowy pliku jest oceniany w środowisku globalnym ("przestrzeń robocza użytkownika") i istnieje, cf. ?source
. Zauważ, że nie ma zmiennej i
w środowisku globalnym. Rozwiązaniem jest upewnienie się, że plik pochodzi ze środowiska, które go wywołuje, tj. Do użycia source(file, local = TRUE)
.
Rozwiązanie:
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)
Przykład tego samego problemu z for()
pętli:
Fakt source()
oceniano na środowisko globalne, który różni się od środowiska wywołującego gdzie i
życia może być również zilustrowane za pomocą zwykłej pętli for, uruchamiając pętlę for w innym środowisku niż globalne, np wewnątrz funkcji lub przez:
local({
for(i in 1:2) {
source("addition.R")
}
})
co daje:
Error in eval(ei, envir) : object 'i' not found
Teraz, dlaczego powyższe foreach(i = 1:2) %dopar% { source("addition.R") }
współpracuje z registerDoSEQ()
wtedy i tylko wtedy nazwie z globalnym środowisku, czy to wtedy iteracja foreach jest oceniana w środowisku wywołującym, które jest środowiskiem globalnym, które jest środowiskiem, z którego korzysta source()
. Jednakże, jeśli jeden użył local(foreach(i = 1:2) %dopar% { ... })
również to nie powiedzie się analogicznie do powyższego wywołania local(for(i in 1:2) { ... })
.
Podsumowując: nic magicznego się nie dzieje, ale zrozumienie tego jest trochę uciążliwe.
Wypróbuj to 'źródło (" addtition.R ", local = T)' aby ocenić źródło w envronment, w którym nazywa się – NicE
Zauważ, że wywołanie source() w% dopar% bloków znacznie spowalnia obliczenia, ponieważ procesy potomne muszą uzyskać ten plik źródłowy za pośrednictwem sieci –