2010-08-03 4 views
22

J'essaye d'écrire une fonction qui trace un ggplot facet_wrap parcelle sur plusieurs pages. C'est juste un hack, car cette fonctionnalité semble être sur la liste des choses à faire de la fonction ggplot2. Je fais quelques petits calculs pour trouver le nombre de pages dont j'ai besoin, le nombre de lignes de mon data.frame dont j'ai besoin par page, etc. Je suis plutôt confiant que tout cela fonctionne.R + ggplot: traçage sur plusieurs pages

pdf(filename) 
for (i in seq(num_pages)){ 
    slice = seq(((i-1)*num_rows)+1,(i*num_rows)) 
    slice = slice[!(slice > nrow(df.merged))] 
    df.segment=df.merged[slice,] 
    p <- ggplot(df.segment, aes(y=mean,x=phenotype)) 
    p <- p + geom_bar(stat="identity",fill="white",colour="black") 
    p + facet_wrap("ID",scales="free_y",ncol=n_facets,nrow=n_facets) 
} 
dev.off() 

Mon problème est que, en enveloppant le tout dans une boucle comme celui-ci, entre les fonctions pdf() et dev.off(), est que la boucle ne semble pas attendre ggplot pour faire sa chose, et flammes à travers sa boucle très rapidement et sort un PDF invalide.

Si je mets i = 1, démarrez le pdf(), exécutez le code ci-dessus dans la boucle, puis définissez i=2, puis exécutez le code, et ainsi de suite jusqu'à ce que je me ennuie (i=3) Ensuite, éteignez l'appareil le PDF résultant est brillant.

Y a-t-il un moyen pour que la boucle for attende que la dernière ligne ait fini de tracer avant de passer à l'itération suivante?

Répondre

29

Je pense que le problème est que vous avez besoin de print() autour de votre dernière ligne (p + ...) pour l'imprimer sur le périphérique à l'intérieur de la boucle for. . .

+0

wow qui fonctionne complètement. Je n'avais aucune idée que l'impression pourrait être utilisée comme ça. –

+0

C'est parce que 'p' est un objet. La dernière ligne de votre code modifie l'objet 'p', mais vous voulez ensuite l'imprimer() sur le périphérique. – JoFrhwld

+0

Ouais, c'est un obstacle commun. Parfois, j'écris une fonction dans ggplot2, et j'omets 'print()' autour de la partie finale, donc je n'ai pas de sortie ... – aL3xa

4

Exactement. La page 39 du livre ggplot2 nous dit que lorsque vous créez des objets ggplot2, vous pouvez les afficher à l'écran avec print(). Cela se produit automatiquement lors de l'exécution interactive, mais dans une boucle ou une fonction, vous devez imprimer() vous-même ".

Questions connexes