2009-08-30 8 views
7

J'ai un ensemble de données d'enquête, et je voudrais générer des graphiques d'une variable particulière, regroupés par pays du répondant. Le code que j'ai écrit pour générer les graphiques est le suivant:Obtenir foreach() et ggplot2 pour s'entendre

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 chose vraiment bizarre? Je peux exécuter le isplit(), mettre country <- nextElem(countries), puis exécuter le code sans envoyer la ligne foreach - et obtenir un joli complot. Si j'envoie le foreach, j'obtiens des fichiers .png vierges.

Merci d'avance pour votre aide.

Je peux certainement le faire avec des boucles R standard, mais j'aimerais vraiment avoir une meilleure compréhension de foreach.

+0

Pourriez-vous envoyer des échantillons de données? Cela rendrait le test beaucoup plus facile. –

+0

Bien sûr. Les données honnête-à-bonté: http://drop.io/cy81s4w/asset/sample-data-rdata –

+0

J'espère que l'utilisation des données réelles est correct - un peu inhabituel, mais il semble le plus efficace. Utilisez simplement load (file.choose()) pour entrer ces données dans R, puis drones <- sample. Vous devrez également définir output.exp dans un dossier où vous souhaitez afficher 19 fichiers .png. –

Répondre

9

Vous devez print l'intrigue si vous voulez afficher:

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

Par défaut, les commandes ggplot retourne un objet intrigue, mais la commande elle-même ne s'affiche pas réellement l'intrigue; cela est fait avec la commande print. Notez que lorsque vous exécutez le code de manière interactive, les résultats des commandes sont imprimés, ce qui explique pourquoi vous n'avez souvent pas besoin de l'impression explicite. Mais lors de l'emballage dans un foreach, vous devez imprimer explicitement car les résultats des commandes du corps ne seront pas répercutés.

+8

Sinon, utilisez 'ggsave' – hadley

+0

Jonathan, merci pour l'explication - cela me sauvera probablement de la confusion dans le futur, aussi. Hadley, merci de mentionner (euh, et d'écrire) ggsave() - c'est lisse. –