Desidero utilizzare la funzionalità parallela del pacchetto plyr
all'interno delle funzioni.Parallelo * all'interno delle funzioni
avrei pensato che il modo corretto per esportare gli oggetti che sono stati creati all'interno del corpo della funzione (in questo esempio, l'oggetto è df_2
) è il seguente
# rm(list=ls())
library(plyr)
library(doParallel)
workers=makeCluster(2)
registerDoParallel(workers,core=2)
plyr_test=function() {
df_1=data.frame(type=c("a","b"),x=1:2)
df_2=data.frame(type=c("a","b"),x=3:4)
#export df_2 via .paropts
ddply(df_1,"type",.parallel=TRUE,.paropts=list(.export="df_2"),.fun=function(y) {
merge(y,df_2,all=FALSE,by="type")
})
}
plyr_test()
stopCluster(workers)
Tuttavia, questo genera un errore di
Error in e$fun(obj, substitute(ex), parent.frame(), e$data) :
unable to find variable "df_2"
così ho fatto qualche ricerca e ha scoperto che funziona, se posso esportare manualmente df_2
workers=makeCluster(2)
registerDoParallel(workers,core=2)
plyr_test_2=function() {
df_1=data.frame(type=c("a","b"),x=1:2)
df_2=data.frame(type=c("a","b"),x=3:4)
#manually export df_2
clusterExport(cl=workers,varlist=list("df_2"),envir=environment())
ddply(df_1,"type",.parallel=TRUE,.fun=function(y) {
merge(y,df_2,all=FALSE,by="type")
})
}
plyr_test_2()
stopCluster(workers)
Dà il risultato corretto
type x.x x.y
1 a 1 3
2 b 2 4
ma ho anche scoperto che il seguente codice funziona
workers=makeCluster(2)
registerDoParallel(workers,core=2)
plyr_test_3=function() {
df_1=data.frame(type=c("a","b"),x=1:2)
df_2=data.frame(type=c("a","b"),x=3:4)
#no export at all!
ddply(df_1,"type",.parallel=TRUE,.fun=function(y) {
merge(y,df_2,all=FALSE,by="type")
})
}
plyr_test_3()
stopCluster(workers)
plyr_test_3()
dà anche il risultato corretto e non capisco perché. Avrei pensato di dover esportare df_2
...
La mia domanda è: qual è il modo giusto per gestire il parallelo *ply
all'interno delle funzioni? Ovviamente, plyr_test()
non è corretto. In qualche modo ho la sensazione che l'esportazione manuale in plyr_test_2()
sia inutile. Ma penso anche che lo plyr_test_3()
sia una specie di cattivo stile di programmazione. Qualcuno potrebbe spiegarci per favore? Grazie ragazzi!
Proprio come una nota a margine: dal momento che stai usando 'ddply', puoi anche provare a utilizzare ** dplyr ** che è la prossima versione di ** plyr ** per i frame di dati e potrebbe velocizzare le prestazioni del codice più della parallelizzazione di 'ddply'. Vedi la [Introduzione a dplyr] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html) –
Grazie. Non lo sapevo. – cryo111
E un'altra nota per le domande future: non mettere 'rm (list = ls())' in commento nella tua domanda. Altri potrebbero eseguire il codice senza accorgersene e quindi rimuovere i dati importanti dalle loro sessioni. –