2013-06-27 31 views
21

Tôi có một tập lệnh R để lưu một số ô bằng cách sử dụng ggsave. Khi tôi chạy tập lệnh từ dòng lệnh, nó không chỉ lưu các ô của tôi mà còn tiết kiệm một tệp Rplots.pdf trống. Làm cách nào để ngăn R tạo tệp không cần thiết này?Cách dừng R khi tạo tệp Rplots.pdf trống khi sử dụng ggsave và Rscript

Dưới đây là một kịch bản ví dụ mà tái tạo các lỗi:

#!/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) 

Tất cả những cách sau đây chạy kịch bản tạo ra các tập tin không cần thiết:

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

Ngoài ra, khi tôi nguồn mã từ bên trong một phiên tương tác, một cửa sổ R Graphics trống rỗng không cần thiết sẽ mở ra.

Hơn nữa, tôi không có những vấn đề nếu tôi sử dụng mã tiết hơn sau ở vị trí của 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() 

Dưới đây là thông tin phiên của tôi (đó là như nhau cho dù chạy Rscript hoặc tương tác):

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

Nếu tôi chỉ định một chiều cao và chiều rộng trong 'ggsave' nó xuất hiện để khắc phục vấn đề của bạn, nhưng tôi thú nhận rằng tôi không biết tại sao ngay lập tức ... nếu tôi đã phải đoán đó là vì các giá trị mặc định là kích thước của "cửa sổ âm mưu hiện tại" cần phải tồn tại trước khi nó có thể đo được chúng. – joran

+0

Tôi chạy 'ggsave' và nó không tạo ra 'RPlots.pdf', chỉ 'example.pdf'. 'ggsave' tương đối đơn giản trong chế độ' debug', bạn có thể thử và xem hàm 'device' đang gọi. –

+0

Tôi thấy hành vi này và xác định các đối số chiều cao và chiều rộng dường như giải quyết cả hai trong một phiên tương tác và sử dụng RScript. – joran

Trả lời

19

Nếu bạn nhìn vào giá trị mặc định cho các đối số chiều rộng và chiều cao trong ggsave, bạn sẽ thấy rằng họ là par("din")[1]par("din")[2]. Nếu bạn chạy điều này trong giao diện điều khiển, bạn sẽ thấy rằng nó sẽ mở ra một cửa sổ đồ họa, nếu nó chưa được mở.

Loại ý nghĩa này, vì để có được chiều rộng/chiều cao của thiết bị tính bằng inch, bạn cần một thiết bị thực tế. Tôi cho rằng người ta có thể lập luận rằng par("din") sẽ trả về lỗi nếu không có thiết bị nào được mở, trong trường hợp Hadley chắc chắn sẽ viết ggsave khác nhau.

Thật vậy, từ ?par:

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

Do đó, quy định cụ thể có chiều rộng/chiều cao sẽ ngăn chặn các thiết bị giả mạo từ khai mạc.

+0

Cảm ơn, @joran! Chỉ định chiều cao và chiều rộng để tránh các cuộc gọi 'par ('din')' sửa lỗi. –

+0

Điều này không hiệu quả đối với tôi (R 3.0.2; ggplot 0.9.3.1); Tôi vẫn nhận được 'Rplots.pdf' ngoài tệp png (hoặc pdf) mà tôi đã chỉ định với' filename'. Có lẽ nó có liên quan đến tham số 'device'? – knowah

+0

@knowah Không chắc chắn; giải pháp này vẫn hoạt động cho tôi trên R 3.1.0 và ggplot2 1.0.0 (Tôi vừa kiểm tra lại nó bằng cách sử dụng mã chính xác từ câu hỏi.) – joran

-1

Tôi cũng gặp sự cố này nhưng các giải pháp ở đây không giải quyết được. Tôi đã tạo ra cốt truyện của mình nhưng không lưu nó như trong một biến. ggsave sẽ lưu lại hình vẽ cuối cùng nên tôi không nghĩ là mình cần. Nếu bạn lưu cốt truyện trong một biến và sau đó làm ggsave (thậm chí không có chỉ định rõ những âm mưu, nó sẽ không tạo ra các tập tin Rplots.pdf

Ví dụ mã:.

thư viện (ggplot2) thư viện (xa xôi)

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) 

phiên Info"

phiên bản R 3.3.2 (2016/10/31) Hệ điều hành: x86_64-apple-darwin13.4.0 (64-bit) Chạy theo: MacOS Sierra 10.12.2

ggplot2_2.2.1.9000

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