Recentemente, ho creato un oggetto factor=1
nel mio spazio di lavoro, non sapendo che esiste una funzione factor
nel pacchetto base
.Strano comportamento ambientale in plyr parallelo
Quello che ho intenzione di fare era di utilizzare la variabile factor
all'interno di un ciclo parallelo, per esempio,
library(plyr)
library(foreach)
library(doParallel)
workers <- makeCluster(2)
registerDoParallel(workers,cores=2)
factor=1
llply(
as.list(1:2),
function(x) factor*x,
.parallel = TRUE,
.paropts=list(.export=c("factor"))
)
Questo, tuttavia, genera un errore che mi ha portato così il tempo per capire. Come sembra, plyr
crea l'oggetto factor
nel suo ambiente exportEnv
, ma utilizza base::factor
invece dell'oggetto fornito dall'utente. Vedere il seguente esempio
llply(
as.list(1:2),
function(x) {
function_env=environment();
global_env=parent.env(function_env);
export_env=parent.env(global_env);
list(
function_env=function_env,
global_env=global_env,
export_env=export_env,
objects_in_exportenv=unlist(ls(envir=export_env)),
factor_found_in_envs=find("factor"),
factor_in_exportenv=get("factor",envir=export_env)
)
},
.parallel = TRUE,
.paropts=list(.export=c("factor"))
)
stopCluster(workers)
Se si controlla l'uscita del llply
, vediamo che la linea factor_in_exportenv=get("factor",envir=export_env)
non restituisce 1
(corrispondente all'oggetto fornito dall'utente), ma la definizione della funzione di base::factor
.
Domanda 1) Come posso capire questo comportamento? Mi sarei aspettato che l'uscita fosse 1
.
Domanda 2) C'è un modo per ottenere un avviso da R
se assegno un nuovo valore a un oggetto che era già definito in un altro pacchetto (come nel mio caso factor
)?
Grazie per l'input. Il problema qui non è tanto l'ambiente di valutazione, quanto l'ambiente 'foreach' utilizza per trovare le variabili che dovrebbero essere esportate. Il problema scompare se si usa un nome di variabile che non è usato in 'base', diciamo' a' invece di 'factor'. So che posso usare direttamente 'foreach' (come hai fatto tu e lo faccio quasi sempre al giorno d'oggi) e che l'errore poi scompare. Ma nel 2013 ero un utente 'plyr' e questo errore mi ha lasciato perplesso. Quindi, volevo risolvere questo per curiosità. – cryo111