Función no encontrada en R doParallel ‘foreach’ – Error en {: la tarea 1 falló – “no se pudo encontrar la función” ráster “”

Intento utilizar un clúster de alto rendimiento en mi institución por primera vez y he encontrado un problema que no puedo resolver.

El siguiente código devuelve un error:

ptime<-system.time({ r <- foreach(z = 1:length(files),.combine=cbind) %dopar% { raster <- raster(paste(folder,files[1],sep="")) data<-getValues(raster) clp <- na.omit(data) for(i in 1:length(classes)){ results[i,z]<-length(clp[clp==classes[i]])/length(clp) print(z) } } }) Error in { : task 1 failed - "could not find function "raster"" 

A también probé un código foreach diferente para otra tarea que tengo:

 r <- foreach (i=1:length(poly)) %dopar% { clip<-gIntersection(paths,poly[i,]) lgth<-gLength(clip) vid<-poly@data[i,3] path.lgth[i,] <- c(vid,lgth) print(i) } 

y esta vez la función gIntersection no se encuentra. Obviamente, todos los paquetes están instalados y cargados. Después de leer algunas publicaciones del foro, parece que tiene que ver con el entorno en el que se ejecutan / funcionan las funciones.

¿Puede ayudarme alguien, por favor? ¡No soy un progtwigdor!

¡Gracias!

Actualizar:

He ajustado mi código para la solución provista:

 results<-matrix(nrow=length(classes),ncol=length(files)) dimnames(results)[[1]]<-classes dimnames(results)[[2]]<-files ptime<-system.time({ foreach(z = 1:length(files),.packages="raster") %dopar% { raster <- raster(paste(folder,files[z],sep="")) data<-getValues(raster) clp <- na.omit(data) for(i in 1:length(classes)){ results[i,z]<-length(clp[clp==classes[i]])/length(clp) print(z) } } }) 

Pero lo que obtengo es una salida (mi matriz de resultados) llena de na. Como puede ver, creo un objeto de matriz llamado resultados para completar con resultados (que funciona con bucles for), pero después de leer la documentación para foreach parece que guarda los resultados de manera diferente con esta función.

¿Y consejos sobre lo que debería elegir para el argumento de Com?

En la viñeta de foreach y en la página de ayuda de foreach, se señala el argumento .packages como necesario para proporcionar al usar cómputo paralelo con funciones que no están cargadas por defecto. Entonces su código en el primer ejemplo debería ser:

 ptime<-system.time({ r <- foreach(z = 1:length(files), .combine=cbind, .packages='raster') %dopar% { # some code # and more code } }) 

Alguna mas explicacion

El paquete foreach realiza muchas configuraciones detrás de escena. Lo que sucede es lo siguiente (en principio, los detalles técnicos son un poco más complicados):

  • foreach establece un sistema de "trabajadores" que puede ver como sesiones R separadas, cada una de las cuales está comprometida con un núcleo diferente en un clúster.

  • La función que debe llevarse a cabo se carga en cada sesión de "trabajador", junto con los objetos necesarios para llevar a cabo la función

  • cada trabajador calcula el resultado para un subconjunto de los datos

  • Los resultados del cálculo en los diferentes trabajadores se recostackn e informan en la sesión R "maestra".

Como los trabajadores pueden verse como sesiones R separadas, los paquetes de la sesión "maestra" no se cargan automáticamente. Debe especificar qué paquetes deben cargarse en esas sesiones de trabajo, y para eso se .package argumento .package de foreach .


Tenga en cuenta que cuando utilice otros paquetes (por ejemplo, en parallel o en snowfall ), tendrá que configurar estos trabajadores de forma explícita y también ocuparse de pasar objetos y cargar paquetes en las sesiones de trabajo.