2009-08-30 21 views
7

Tengo un conjunto de datos de encuestas, y me gustaría generar gráficos de una variable en particular, agrupados por el país del encuestado. El código que he escrito para generar las tramas hasta ahora es:Cómo hacer que foreach() y ggplot2 se lleven bien

countries <- isplit(drones, drones$v3) 
foreach(country = countries) %dopar% { 
    png(file = paste(output.exp, "/Histogram of Job Satisfaction in ", country$key[[1]], ".png", sep = "")) 
    country.df <- data.frame(country) #ggplot2 doesn't appreciate the lists nextElem() produces 
    ggplot(country.df, aes(x = value.v51)) + geom_histogram() 
    dev.off() 
} 

Lo verdaderamente extraño? Puedo ejecutar el isplit(), establecer country <- nextElem(countries), y luego ejecutar el código sin enviar la línea foreach - y obtener una trama encantadora. Si envío foreach, obtengo algunos archivos .png en blanco.

Gracias de antemano por su ayuda.

Definitivamente puedo hacer esto con los lazos R estándar, pero me gustaría obtener una mejor comprensión de foreach.

+0

¿Podría publicar algunos datos de muestra? Sería mucho más fácil de probar. –

+0

Por supuesto. Los datos de honestidad: http://drop.io/cy81s4w/asset/sample-data-rdata –

+0

Espero que el uso de los datos reales esté bien, un poco inusual, pero parece ser el más eficiente. Simplemente use load (file.choose()) para ingresar esos datos en R, luego drones <- sample. También deberá establecer output.exp en alguna carpeta donde desee que aparezcan 19 archivos .png. –

Respuesta

9

Necesitas print la trama si desea que se muestre:

print(ggplot(country.df, aes(x = value.v51)) + geom_histogram()) 

Por defecto, los comandos ggplot devolver un objeto de trama, pero el propio comando en realidad no mostrar la trama; eso se hace con el comando print. Tenga en cuenta que cuando ejecuta el código de forma interactiva, los resultados de los comandos se imprimen, por lo que a menudo no necesita la impresión explícita. Pero al envolver en un foreach, debe imprimir explícitamente ya que los resultados de los comandos en el cuerpo no se repetirán.

+8

Alternativamente, use 'ggsave' – hadley

+0

Jonathan, gracias por la explicación, que probablemente también me salve la confusión en el futuro. Hadley, gracias por mencionar (eh, y escribir) ggsave() - es suave. –

Cuestiones relacionadas