2012-02-09 27 views
12

Tôi có một chức năng nào công cụ và sau đó âm mưu dựa trên một điều kiện:Sử dụng chức năng png không hoạt động khi gọi trong vòng một hàm

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) 

tôi nhận được một file png trống vào cuối này. Chuyện gì đang xảy ra ở đây?

+6

Đó là một [FAQ] (http://cran.r-project.org/doc/FAQ/R-FAQ. html # Tại sao-do-lattice_002ftrellis-graphics-not-work_003f) và bạn vẫn nên sử dụng 'ggsave'. – joran

+2

có thể trùng lặp của [qgot của ggplot không thực hiện trên tìm nguồn cung ứng] (http://stackoverflow.com/questions/6675066/ggplots-qplot-does-not-execute-on-sourcing) – joran

+1

có thể trùng lặp của [Lưu ggplot trong một hàm ] (http://stackoverflow.com/questions/7034647/save-ggplot-within-a-function) –

Trả lời

13

Từ phản ứng, đây là hai giải pháp:

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) 

Lưu ý: Tôi đã nhận thức được rằng tôi cần phải sử dụng print(), nhưng cách tôi đã cố gắng này đã không làm việc vì nó không được đặt ở bên phải địa điểm.

Ngoài ra, tôi đã thử tùy chọn ggsave trước đây, nhưng điều đó cũng không hoạt động. Tất nhiên, nó bây giờ hoạt động như là tốt. Nó cũng có vẻ có độ phân giải tốt hơn so với sử dụng 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) 

Cảm ơn tất cả.

+0

Bạn có thể chấp nhận câu trả lời của riêng mình. Cho mọi người thấy câu hỏi của bạn đã được giải quyết. –

+0

FYI, bạn có thể đặt độ phân giải mong muốn bằng png(). Ví dụ: nếu bạn muốn một hình ảnh có kích thước 300 dpi và 6 inch vuông, bạn có thể gọi png ('plot.png', chiều cao = 6, chiều rộng = 6, res = 300, units = 'in') – qdread

6

Tôi vừa học được từ trang web khác (liên kết được cung cấp bên dưới). Trong một vòng lặp, bạn phải sử dụng rõ ràng chức năng in để làm cho hàm jpeg(), png() hoạt động. Trong bài đăng gốc, bạn chỉ có thể thêm một dòng in (p).

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

Trong liên kết dưới đây, nó cung cấp một lời giải thích tốt cho việc này https://stat545-ubc.github.io/block017_write-figure-to-file.html#despair-over-non-existent-or-empty-figures

+0

chào mừng bạn đến như vậy. Vui lòng định dạng mã trong bài đăng của bạn. –

Các vấn đề liên quan