Il commento di NiceE e la risposta di Sosel riguardano già questo; quando si chiama source(file)
, il valore predefinito è source(file, local = FALSE)
, il che significa che il codice nel file di origine sta valutando nell'ambiente globale ("area di lavoro dell'utente") e non esiste, cfr. ?source
. Si noti che non vi è alcuna variabile i
nell'ambiente globale. La soluzione è assicurarsi che il file sia fornito nell'ambiente che lo chiama, cioè per utilizzare source(file, local = TRUE)
.
Soluzione:
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)
Esempio dello stesso problema con un for()
ciclo:
Il fatto che source()
viene valutata nel contesto globale che è diverso dall'ambiente chiamante dove i
vite può anche essere illustrato utilizzando un ciclo for regolare eseguendo il ciclo for in un altro ambiente rispetto al globale, ad es all'interno di una funzione o per:
local({
for(i in 1:2) {
source("addition.R")
}
})
che dà:
Error in eval(ei, envir) : object 'i' not found
Ora, la ragione per cui le suddette foreach(i = 1:2) %dopar% { source("addition.R") }
opere con registerDoSEQ()
se e solo se chiamato dal contesto globale, è che allora la L'iterazione foreach viene valutata nell'ambiente di chiamata, che è l'ambiente globale, che è l'ambiente utilizzato da source()
. Tuttavia, se si utilizza local(foreach(i = 1:2) %dopar% { ... })
anche questo fallisce in modo analogo alla precedente chiamata local(for(i in 1:2) { ... })
.
In conclusione: non accade nulla di magico, ma capirlo è un po 'noioso.
Provare questo 'source (" addtition.R ", local = T)' per valutare la sorgente nell'ambiente in cui è chiamato – NicE
I find source() chiama in% dopar% blocchi rallenta notevolmente il calcolo, come i processi figli devono ottenere quel file sorgente attraverso il networking –