2013-06-27 11 views
21

Ho uno script R che salva alcuni grafici usando ggsave. Quando eseguo lo script dalla riga di comando, non solo salva i miei grafici ma anche un file Rplots.pdf vuoto. Come posso evitare che R crei questo file non necessario?Come interrompere R dalla creazione di file Rplots.pdf vuoto quando si utilizza ggsave e Rscript

Ecco uno script di esempio che riproduce l'errore:

#!/usr/bin/env Rscript 

# Code that creates unnecessary Rplots.pdf file 
library(ggplot2) 
my.data <- data.frame(x = 1:10, y = 1:10) 
my.plot <- qplot(x, y, data = my.data) 
ggsave('example.png', my.plot) 

Tutte le seguenti modalità di esecuzione dello script creare il file non necessari:

Rscript script.R 
Rscript --vanilla script.R 
chmod a+x script.R 
./script.R 

Inoltre, quando ho fonte il codice dall'interno una sessione interattiva, si apre una finestra vuota di R Graphics Device non necessaria.

Inoltre, non ho questi problemi se uso il il seguente codice più dettagliato al posto di ggsave:

#!/usr/bin/env Rscript 

# Code that does NOT create unnecessary Rplots.pdf file 
library(ggplot2) 
my.data <- data.frame(x = 1:10, y = 1:10) 
my.plot <- qplot(x, y, data = my.data) 
png(file = 'example.png') 
print(my.plot) 
dev.off() 

Ecco il mio informazioni di sessione (che è lo stesso se in esecuzione rscript o in modo interattivo):

R version 3.0.1 (2013-05-16) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] methods stats  graphics grDevices utils  datasets base  

other attached packages: 
[1] ggplot2_0.9.3.1 

loaded via a namespace (and not attached): 
[1] colorspace_1.2-2 dichromat_2.0-0 digest_0.6.3  grid_3.0.1   
[5] gtable_0.1.2  labeling_0.1  MASS_7.3-26  munsell_0.4  
[9] plyr_1.8   proto_0.3-10  RColorBrewer_1.0-5 reshape2_1.2.2  
[13] scales_0.2.3  stringr_0.6.2 
+0

Se specifico un altezza e la larghezza in 'ggsave' sembra risolvere il problema, ma confesso che non so subito perché ... se dovessi indovinare è perché i valori di default sono le dimensioni della "finestra di plottaggio corrente" che avrebbe bisogno di esistere prima che potesse misurarli. – joran

+0

Ho eseguito 'ggsave' e non ho creato' RPlots.pdf', solo 'example.pdf'. 'ggsave' è relativamente semplice in modalità' debug', si può provare e vedere quale funzione 'device' sta chiamando. –

+0

Vedo questo comportamento e la specifica degli argomenti di altezza e larghezza sembra risolverlo sia in una sessione interattiva che utilizzando RScript. – joran

risposta

19

Se si guardano le impostazioni predefinite per la larghezza e altezza argomenti a ggsave, vedrete che sono par("din")[1] e par("din")[2]. Se lo esegui nella console, vedrai che apre una finestra grafica, se non è già aperta.

Questo tipo di ha senso, dal momento che per ottenere il dispositivo larghezza/altezza in pollici, è necessario un dispositivo reale. Suppongo che si potrebbe sostenere che par("din") dovrebbe restituire un errore se nessun dispositivo è aperto, nel qual caso Hadley sicuramente avrebbe scritto ggsave in modo diverso.

Infatti, da ?par:

If the current device is the null device, par will open a new device before querying/setting parameters.

Quindi, indicando larghezza/altezza impedirà il dispositivo spuria apertura.

+0

Grazie, @joran! Specificare l'altezza e la larghezza per evitare le chiamate 'par ('din')' risolve il problema. –

+0

Questo non ha funzionato per me (R 3.0.2; ggplot 0.9.3.1); Ricevo ancora 'Rplots.pdf' oltre al file png (o pdf) che ho specificato con' filename'. Forse ha qualcosa a che fare con il parametro 'device'? – knowah

+0

@knowah Non sono sicuro; questa soluzione funziona ancora per me su R 3.1.0 e ggplot2 1.0.0 (l'ho appena testata nuovamente usando il codice esatto della domanda.) – joran

-1

Ho avuto questo problema anche se le soluzioni qui non lo risolvono. Avevo generato la mia trama ma non l'ho salvata come in una variabile. ggsave salverà l'ultima cifra tracciata quindi non pensavo di averne bisogno. Se si salva la trama in una variabile e poi fare ggsave (anche senza specificare esplicitamente la trama, non genererà il file Rplots.pdf

codice di esempio:.

libreria (ggplot2) libreria (lontana)

ff_lmer <- ggplot(ff, aes(x = thorax, y = longevity, color = activity)) + 
    geom_point() + 
    geom_smooth(method = lm, se = FALSE) 

ggsave("fig/ff_lmer.pdf", width = 5, height = 5) 

Session Info"

versione R 3.3.2 (2016/10/31) Piattaforma: x86_64-apple-darwin13.4.0 (64-bit) Esecuzione sotto: MacOS Sierra 10.12.2

ggplot2_2.2.1.9000

Problemi correlati