2012-02-09 11 views
12

Tengo una función que hace parcelas cosas y luego en base a una condición:png que no trabaja cuando se le llama dentro de una función

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) 

me sale un archivo PNG en blanco al final de esta. ¿Que esta pasando aqui?

+6

Es un [FAQ] (http://cran.r-project.org/doc/FAQ/R-FAQ. html # Why-do-lattice_002ftrellis-graphics-not-work_003f) y deberías usar 'ggsave' de todos modos. – joran

+2

posible duplicado de [qplot de ggplot no se ejecuta en el origen] (http://stackoverflow.com/questions/6675066/ggplots-qplot-does-not-execute-on-sourcing) – joran

+1

posible duplicado de [Guardar ggplot dentro de una función ] (http://stackoverflow.com/questions/7034647/save-ggplot-within-a-function) –

Respuesta

13

De las respuestas, aquí hay dos soluciones:

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: Yo era consciente de que tenía que utilizar print(), pero la forma en que probé este no funcionó debido a que no fue colocado en la derecha lugar.

Además, había probado la opción ggsave anteriormente, pero tampoco funcionó. Por supuesto, ahora también funciona. También parece tener una resolución mejor que usar png():

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) 

Gracias todos.

+0

Puede aceptar su propia respuesta. Muestra a todos que tu pregunta ha sido resuelta. –

+0

FYI, puede establecer la resolución deseada usando png(). Por ejemplo, si quiere una imagen a 300 ppp y 6 pulgadas cuadradas, puede llamar a png ('plot.png', height = 6, width = 6, res = 300, units = 'in') – qdread

6

Acabo de aprender de otro sitio web (enlace proporcionado a continuación). En un bucle, debe usar explícitamente la función de impresión para hacer funcionar la función jpeg(), png(). En la publicación original, puede agregar una línea de impresión (p).

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

En el siguiente enlace, que proporciona una buena explicación para esto https://stat545-ubc.github.io/block017_write-figure-to-file.html#despair-over-non-existent-or-empty-figures

+0

bienvenido a. Por favor, formatee el código en su publicación. –

Cuestiones relacionadas