web-dev-qa-db-fra.com

Enregistrer ggplot dans une fonction

J'essaie d'enregistrer un ggplot dans une fonction à l'aide de périphériques graphiques. Mais j'ai trouvé que le code produit des graphiques vides. Voici un exemple très très simple.

library(ggplot2)
ff <- function(){
  jpeg("a.jpg")
  qplot(1:20, 1:20)
  dev.off()
}
ff()

Si je lance uniquement le contenu de la fonction, tout va bien. Je sais que l'utilisation de ggsave () fera ce que je veux, mais je me demande simplement pourquoi jpeg () plus dev.off () ne fonctionne pas. J'ai essayé cela avec différentes versions de R et le problème persiste.

35
Wei Wang

Vous devez utiliser ggsave au lieu de la séquence jpeg(); print(p); dev.off(). ggsave est un wrapper qui fait exactement ce que vous avez l'intention de faire avec votre fonction, sauf qu'il offre plus d'options et de polyvalence. Vous pouvez spécifier le type de sortie de manière explicite, par exemple jpg ou pdf, ou il devinera à partir de votre extension de nom de fichier.

Ainsi, votre code pourrait devenir quelque chose comme:

p <- qplot(1:20, 1:20)
ggsave(filename="a.jpg", plot=p)

Voir ?ggsave pour plus de détails


La raison pour laquelle le comportement d'origine dans votre code n'a pas fonctionné est en effet une question fréquemment posée (sur stackoverlflow ainsi que FAQ R sur CRAN ). Vous devez insérer une instruction print pour imprimer le tracé. Dans la console interactive, l'impression est exécutée en silence en arrière-plan.

44
Andrie

Ces tracés doivent être imprimés:

ff <- function(){
  jpeg("a.jpg")
  p <- qplot(1:20, 1:20)
  print(p)
  dev.off()
}
ff()

C'est une erreur très courante .

16
joran