2012-09-21 53 views
5

tengo este fragmento de código reproducible RNo se pudo encontrar la función dentro 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) 

y me sale el siguiente mensaje de error:

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

estoy usando R 2.14.1 bajo Ubuntu. MPI está instalado y funcionando.

Sé que hay un problema similar para el constructo foreach, pero permite hacer referencia a las funciones manualmente a través del parámetro .export. No pude encontrar nada similar para clusterApply. ¿Hay una solución para esto?

Gracias!

Respuesta

10

Su función no se envió a los trabajadores. Quizás la mejor forma de hacerlo es exportar la función directamente:

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

Creo que su problema está relacionado con "alcance variable". En Mac/Linux tiene la opción de utilizar makeCluster (no_core, type = "FORK") que contiene automáticamente todas las variables de entorno. En Windows, debe usar el Ensamble de Socket Paralelo (PSOCK) que comienza con solo los paquetes base cargados. Por lo tanto, siempre especifica exactamente qué variables y qué biblioteca incluir para que funcionen las funciones paralelas. clusterExport() y clusterEvalQ() son necesarios para que la función vea las variables y los paquetes necesarios, respectivamente. Tenga en cuenta que cualquier cambio en la variable después de clusterExport se ignora. Regreso a su problema. Debe usar lo siguiente:

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) 
Cuestiones relacionadas