mi sono appassionato del pacchetto parallel
in R e quanto sia facile e intuitivo è di fare versioni parallele di apply
, sapply
, eccpiù semplice modo per farlo replicare parallelo
C'è una funzione parallela simile per replicate
?
mi sono appassionato del pacchetto parallel
in R e quanto sia facile e intuitivo è di fare versioni parallele di apply
, sapply
, eccpiù semplice modo per farlo replicare parallelo
C'è una funzione parallela simile per replicate
?
si può semplicemente utilizzare le versioni parallele di lapply
o sapply
, invece di dire di replicare questa espressione n
volte non la applica sulla 1:n
e invece di dare un'espressione, si avvolge quell'espressione in una funzione che ignora l'argomento inviato ad esso.
forse qualcosa di simile:
#create cluster
library(parallel)
cl <- makeCluster(detectCores()-1)
#get library support needed to run the code
clusterEvalQ(cl,library(repsych))
#put objects in place that might be needed for the code
clusterExport(cl,c("myData"))
#... then parallel replicate...
parSapply(cl, 1:10000, function(i,...) { x <- rnorm(10); mean(x)/sd(x) })
#stop the cluster
stopCluster(cl)
come l'equivalente parallelo di:
replicate(10000, {x <- rnorm(10); mean(x)/sd(x) })
Questo è il meglio che ho potuto venire con:
cl <- makeCluster(getOption("cl.cores", 4))
clusterCall(cl, replicate(50, simulate_fxns()))
stopCluster(cl)
'clusterCall' esegue una funzione di una volta per ogni lavoratore in un cluster, restituendo una lista con che molti elementi. Non mi sembra molto "replicare" per me. –
Sì, l'ho appena capito. Sto ancora cercando di trovare una risposta migliore. Qualche idea? – bdeonovic
Questo nuovo esempio non funziona perché stai passando un'espressione a 'clusterCall' piuttosto che a una funzione. Funzionerebbe con 'clusterEvalQ', ma avresti anche bisogno di esportare' simulate_fxns'. –
Utilizzando clusterEvalQ
come modello, penso che vorrei realizzare un parallelo replicate
come:
parReplicate <- function(cl, n, expr, simplify=TRUE, USE.NAMES=TRUE)
parSapply(cl, integer(n), function(i, ex) eval(ex, envir=.GlobalEnv),
substitute(expr), simplify=simplify, USE.NAMES=USE.NAMES)
Gli argomenti simplify
e USE.NAMES
sono compatibili con anziché replicate
, ma a mio parere costituiscono un involucro migliore attorno a parSapply
.
Ecco un esempio derivato dalla pagina replicate
man:
library(parallel)
cl <- makePSOCKcluster(3)
hist(parReplicate(cl, 100, mean(rexp(10))))
Grazie, questo è quello che ho finito quando ho letto che replicare era solo un involucro per zaffiro. – bdeonovic