2009-08-30 11 views
7

Ho una serie di dati del sondaggio e vorrei generare grafici di una particolare variabile, raggruppati per paese del rispondente. Il codice che ho scritto finora per generare i grafici è:Ottenere foreach() e ggplot2 per andare avanti

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() 
} 

La cosa veramente bizzarra? Posso eseguire isplit(), impostare country <- nextElem(countries) e quindi eseguire il codice senza inviare la riga foreach e ottenere una trama piacevole. Se invio il foreach, ottengo alcuni file .png vuoti.

Grazie in anticipo per il vostro aiuto.

Posso sicuramente farlo con i loop R standard, ma mi piacerebbe davvero avere una migliore comprensione su foreach.

+0

Potresti postare alcuni dati di esempio? Sarebbe molto più facile da testare. –

+0

Ovviamente. I dati onesti per la bontà: http://drop.io/cy81s4w/asset/sample-data-rdata –

+0

Spero che l'uso dei dati effettivi sia a posto - un po 'insolito, ma sembra il più efficiente. Basta usare load (file.choose()) per inserire quei dati in R, quindi droni <- sample. Dovrai inoltre impostare output.exp in una cartella in cui desideri visualizzare 19 file .png. –

risposta

9

È necessario print la trama, se si vuole visualizzare:

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

Per impostazione predefinita, i comandi ggplot restituire un oggetto trama, ma il comando stesso in realtà non visualizzare il grafico; ciò viene eseguito con il comando print. Si noti che quando si esegue il codice in modo interattivo, i risultati dei comandi vengono stampati, motivo per cui spesso non è necessario stampare esplicitamente. Ma quando si esegue il wrapping in un foreach, è necessario stampare esplicitamente poiché i risultati dei comandi nel corpo non verranno riprodotti.

+8

In alternativa, usa 'ggsave' – hadley

+0

Jonathan, grazie per la spiegazione - che probabilmente mi risparmierà anche in futuro. Hadley, grazie per aver menzionato (uh e scritto) ggsave() - è scorrevole. –

Problemi correlati