2012-09-21 18 views
5

ho questo riproducibile R frammentoImpossibile trovare la funzione all'interno clusterApply

rm(list=ls()) 

library(doSNOW) 

f <- function(a, b) a+b 
g <- function(c) f(c*c, c+c) 

v <- c(1, 2, 3, 4, 5, 6) 

cl <- makeMPIcluster(1) 
cat(clusterApply(cl, v, g)) 
stopCluster(cl) 

e ottengo il seguente messaggio di errore:

Error in checkForRemoteErrors(val) : 
    6 nodes produced errors; first error: could not find function "f" 

Sto usando R 2.14.1 sotto Ubuntu. MPI è installato e funzionante.

So che esiste un problema simile per il costrutto foreach, ma consente di fare riferimento alle funzioni manualmente tramite il parametro .export. Non ho trovato nulla di simile per clusterApply. C'è una soluzione per questo?

Grazie!

risposta

10

La tua funzione non è stata inviata ai lavoratori. Forse il modo migliore per farlo è quello di esportare la funzione direttamente:

clusterExport(cl, list("f", "g")) 
4

Credo che il problema si riferiscono a "portata variabile". Su Mac/Linux hai la possibilità di usare makeCluster (no_core, type = "FORK") che contiene automaticamente tutte le variabili d'ambiente. Su Windows devi usare Parallel Socket Cluster (PSOCK) che inizia con solo i pacchetti base caricati. Pertanto, si specifica sempre esattamente quali variabili e la libreria che si include per il funzionamento della funzione parallela. clusterExport() e clusterEvalQ() sono necessari in modo che la funzione visualizzi rispettivamente le variabili e i pacchetti necessari. Si noti che eventuali modifiche alla variabile dopo clusterExport vengono ignorate. Ritorna al tuo problema. È necessario utilizzare come segue:

rm(list=ls()) 
library(doSNOW) 
f <- function(a, b) a+b 
g <- function(c) f(c*c, c+c) 
v <- c(1, 2, 3, 4, 5, 6) 
cl <- makeMPIcluster(1) 
# insert code here 
clusterExport(cl, list("f", "g")) 
# insert clusterEvalQ(cl, library(...)) if you need library for function to parallel 
cat(clusterApply(cl, v, g)) 
stopCluster(cl) 
Problemi correlati