2012-02-09 3 views
12

ho una funzione che fa roba e poi trame base a una condizione:Utilizzando la funzione png non funziona quando viene chiamato all'interno di una funzione

f <- function(n) { 
    rand <- rnorm(n) 
    no <- seq_len(n) 
    df <- data.frame(no=no, rand=rand) 
    if (n > 10) { 
    png("plot.png") 
    p <- ggplot(df) 
    p + geom_point(aes(x=no, y=rand)) 
    dev.off() 
    } 
} 

f(11) 

ottengo un file PNG vuota alla fine di questa. Che cosa sta succedendo qui?

+6

E 'un [FAQ] (http://cran.r-project.org/doc/FAQ/R-FAQ. html # Why-do-lattice_002ftrellis-graphics-not-work_003f) e dovresti comunque usare 'ggsave'. – joran

+2

possibile duplicato di [qplot di ggplot non eseguito sul sourcing] (http://stackoverflow.com/questions/6675066/ggplots-qplot-does-not-execute-on-sourcing) – joran

+1

possibile duplicato di [Salva ggplot all'interno di una funzione ] (http://stackoverflow.com/questions/7034647/save-ggplot-within-a-function) –

risposta

13

Da risposte, qui ci sono due soluzioni:

library(ggplot2) 
f <- function(n) { 
    rand <- rnorm(n) 
    no <- seq_len(n) 
    df <- data.frame(no=no, rand=rand) 
    if (n > 10) { 
    png("plot.png") 
    print({ 
     p <- ggplot(df) 
     p + geom_point(aes(x=no, y=rand)) 
    }) 
    dev.off()  
    } 
} 

f(11) 

Nota: ero consapevole che avevo bisogno di usare print(), ma il modo in cui ho provato questo non ha funzionato perché non è stato collocato nella giusta posto.

Inoltre, avevo già provato l'opzione ggsave, ma non ha funzionato. Certo, ora funziona pure. Sembra anche avere una risoluzione migliore rispetto all'utilizzo di png(): tutti

library(ggplot2) 
f <- function(n) { 
    rand <- rnorm(n) 
    no <- seq_len(n) 
    df <- data.frame(no=no, rand=rand) 
    if (n > 10) { 
    p <- ggplot(df) 
    p + geom_point(aes(x=no, y=rand)) 
    ggsave(file="plot.png") 
    } 
} 

f(11) 

Grazie.

+0

Puoi accettare la tua risposta. Mostra a tutti la tua domanda è stata risolta. –

+0

FYI, puoi impostare la risoluzione desiderata usando png(). Ad esempio se vuoi un'immagine a 300 dpi e 6 pollici quadrati, puoi chiamare png ('plot.png', height = 6, width = 6, res = 300, units = 'in') – qdread

6

Ho appena imparato da un altro sito Web (collegamento fornito di seguito). In un ciclo devi usare esplicitamente la funzione di stampa per far funzionare la funzione jpeg(), png(). Nel post originale, puoi semplicemente aggiungere una riga di stampa (p).

if (n > 10) { 
     png("plot.png") 
     p <- ggplot(df) 
     p + geom_point(aes(x=no, y=rand)) 
     print(p) 
     dev.off() 
    } 

Nel link sottostante, fornisce una buona spiegazione per questo https://stat545-ubc.github.io/block017_write-figure-to-file.html#despair-over-non-existent-or-empty-figures

+0

benvenuto in questo modo. Si prega di formattare il codice nel tuo post. –