2010-11-17 44 views
6

Tôi bắt đầu sử dụng Sweave một thời gian trước đây. Tuy nhiên, giống như hầu hết mọi người tôi gặp khá sớm một vấn đề lớn: Tốc độ. Sweaving một tài liệu lớn có tuổi để chạy, mà làm cho hiệu quả làm việc khá khó khăn. Xử lý dữ liệu có thể được tăng tốc rất nhiều với cacheSweave. Tuy nhiên, lô - đặc biệt là ggplot;) - vẫn mất quá nhiều thời gian để hiển thị. Đó là cách tôi muốn sử dụng pgfSweave.Các vấn đề với ggplot và pgfSweave

Sau nhiều, nhiều giờ, cuối cùng tôi đã thành công trong việc thiết lập một hệ thống làm việc với Eclipse/Statet/Texlipse. Sau đó tôi muốn chuyển đổi một báo cáo hiện có để sử dụng với pgfSweave và có một bất ngờ xấu: hầu hết các ggplots của tôi dường như không hoạt động nữa. Cốt truyện sau đây ví dụ hoạt động hoàn hảo trong giao diện điều khiển và Sweave:

pl <- ggplot(plot_info,aes(elevation,area)) 
pl <- pl + geom_point(aes(colour=que_id)) 
print(pl) 

Chạy nó với pgfSweave, tuy nhiên, tôi nhận được lỗi này:

Error in if (width > 0) { : missing value where TRUE/FALSE needed 
In addition: Warning message: 
In if (width > 0) { : 
    the condition has length > 1 and only the first element will be used 
Error in driver$runcode(drobj, chunk, chunkopts) : 
    Error in if (width > 0) { : missing value where TRUE/FALSE needed 

Khi tôi loại bỏ aes (...) từ geom_point , cốt truyện hoạt động hoàn hảo với pgfSweave.

pl <- ggplot(plot_info,aes(elevation,area)) 
pl <- pl + geom_point() 
print(pl) 

Chỉnh sửa: Tôi đã điều tra thêm về vấn đề này và có thể giảm sự cố cho thiết bị tikz.

này chỉ hoạt động tốt:

quartz() 
pl <- ggplot(plot_info,aes(elevation,area)) 
pl <- pl + geom_point(aes(colour=que_id)) 
print(pl) 

này cung cấp cho các lỗi trên:

tikz('myPlot.tex',standAlone = T) 
pl <- ggplot(plot_info,aes(elevation,area)) 
pl <- pl + geom_point(aes(colour=que_id)) 
print(pl) 
dev.off() 

này chỉ hoạt động tốt cũng như:

tikz('myPlot.tex',standAlone = T) 
pl <- ggplot(plot_info,aes(elevation,area)) 
pl <- pl + geom_point() 
print(pl) 
dev.off() 

tôi có thể lặp lại điều này với 5 khác nhau ggplots. Khi không sử dụng màu (hoặc kích thước, alpha, ...) trong ánh xạ, nó hoạt động với tikz.

Q1: Có ai có bất kỳ lời giải thích nào về hành vi này không?

Ngoài ra, bộ nhớ đệm của các khối mã không theo lô không hoạt động tốt. Đoạn mã sau đây không mất thời gian chút nào với Sweave. Với pgfSweave, mất khoảng 10 giây.

<<plot.opts,echo=FALSE,results=hide,cache=TRUE>>= 
#colour and plot options are globally set 
pal1 <- brewer.pal(8,"Set1") 
pal_seq <- brewer.pal(8,"YlOrRd") 
pal_seq <- c("steelblue1","tomato2") 
opt1 <- opts(panel.grid.major = theme_line(colour = "white"),panel.grid.minor = theme_line(colour = "white")) 
sca_fill_cont_opt <- scale_fill_continuous(low="steelblue1", high="tomato2") 
ory <- geom_hline(yintercept=0,alpha=0.4,linetype=2) 
orx <- geom_vline(xintercept=0,alpha=0.4,linetype=2) 
ts1 <- 2.3 
ts2 <- 2.5 
ts3 <- 2.8 
ps1 <- 6 
offset_x <- function(x,y) 0.15*x/pmax(abs(x),abs(y)) 
offset_y <- function(x,y) 0.05*y/pmax(abs(x),abs(y)) 
plot_size <- 50*50 

Điều này có vẻ là một hành vi khá lạ, vì chỉ một số biến được đặt để sử dụng sau này.

Q2: Mọi người có bất kỳ lời giải thích nào về điều đó không?

Q3: Nói chung, tôi muốn hỏi xem có ai đang sử dụng pgfSweave thành công không? Với thành công tôi có nghĩa là tất cả mọi thứ mà làm việc trong Sweave cũng làm việc trong pgfSweave, với lợi ích bổ sung của phông chữ đẹp và tốc độ được cải thiện. ;)

Cảm ơn rất nhiều vì đã trả lời!

+1

Tôi không sử dụng sweave vì vậy không thể bình luận về điều đó nhưng tôi có thể nhận xét rằng ggplot chậm, đây là vấn đề đã biết khi vẽ dữ liệu với> 1000 điểm (đôi khi ít hơn). Nếu bạn đang tìm kiếm đồ thị "nhanh hơn", hãy thử Lattice hoặc Base Graphics. Dù vậy, chúng sẽ không đẹp như thế. –

+0

... và thông thường, tốc độ không phải là vấn đề lớn khi vẽ đồ thị. Trừ khi bạn muốn sử dụng Sweave ...;) – donodarazao

+1

Xin chào donodarazo, Tôi là một trong những tác giả của tikzDevice. Tôi sẽ cố gắng tái tạo các vấn đề ggplot của bạn để xem liệu có khắc phục hay không. Nếu bạn có thể lưu 'elevation',' area' và 'que_id' thành một tệp RData và gửi liên kết tải xuống đến địa chỉ email được liệt kê trong mục nhập gói trên CRAN, nó sẽ giúp ích. Tôi cũng sẽ chuyển tiếp câu hỏi này cho Cameron --- anh ta có thể có một số ý tưởng liên quan đến vấn đề pgfSweave. – Sharpie

Trả lời

4

Q1: Does anybody have any explanations for this behavior?

Đây là ba lý do đằng sau lý do tại sao tikzDevice đưa ra một lỗi khi cố gắng để xây dựng cốt truyện của bạn:

  • Khi bạn thêm một bản đồ thẩm mỹ mà tạo ra một huyền thoại, chẳng hạn như aes(colour=que_id), ggplot2 sẽ sử dụng tên biến là tiêu đề của chú giải --- trong trường hợp này, que_id.

  • TikzDevice chuyển tất cả các chuỗi, chẳng hạn như tiêu đề chú giải, sang LaTeX để sắp chữ.

  • Trong LaTeX ký tự gạch dưới, _, được sử dụng để biểu thị một chỉ số. Nếu dấu gạch dưới được sử dụng ngoài chế độ toán, nó sẽ gây ra lỗi.

Khi tikzDevice cố gắng để tính toán chiều cao và chiều rộng của danh hiệu huyền thoại, "que_id", nó vượt qua chuỗi để LaTeX cho sắp chữ và hy vọng LaTeX trở về chiều rộng và chiều cao của chuỗi. LaTeX bị lỗi vì có dấu gạch dưới không thoát được sử dụng trong chuỗi bên ngoài mã toán. Các tikzDevice nhận được một NULL cho chiều rộng chuỗi thay vì một số gây ra một kiểm tra if (width > 0) thất bại.

cách để tránh những vấn đề

  1. Chỉ định một danh hiệu huyền thoại để sử dụng bằng cách thêm một thang màu:

    p1 <- ggplot(plot_info, aes(elevation, area)) 
    p1 <- p1 + geom_point(aes(colour=que_id)) 
    
    
    # Add a name that is easier for humans to read than the variable name 
    p1 <- p1 + scale_colour_brewer(name="Que ID") 
    
    
    # Or, replace the underscore with the appropriate LaTeX escape sequence 
    p1 <- p1 + scale_colour_brewer(name="que\\textunderscore id") 
    
  2. Sử dụng tính năng chuỗi sanitization giới thiệu trong tikzDevice 0.5.0 (nhưng đã bị phá vỡ cho đến 0.5.2). Hiện tại, việc vệ sinh chuỗi sẽ chỉ thoát khỏi các ký tự sau: %, $, {, }^ theo mặc định. Tuy nhiên, bạn có thể chỉ định cặp thay thế thêm qua các tùy chọn tikzSanitizeCharacterstikzReplacementCharacters:

    # Add underscores to the sanitization list 
    options(tikzSanitizeCharacters = c('%','$','}','{','^', '_')) 
    options(tikzReplacementCharacters = c('\\%','\\$','\\}','\\{', 
        '\\^{}', '\\textunderscore')) 
    
    
    # Turn on string sanitization when starting the plotting device 
    tikz('myPlot.tex', standAlone = TRUE, sanitize = TRUE) 
    print(p1) 
    dev.off() 
    

Chúng tôi sẽ công bố phiên bản 0.5.3 của tikzDevice trong vài tuần tới để giải quyết một số thông điệp cảnh báo gây phiền nhiễu hiện đang hiển thị do những thay đổi trong cách R xử lý system(). Tôi sẽ bổ sung các thay đổi sau phiên bản tiếp theo này:

  • Better thông điệp cảnh báo khi widthNULL chỉ ra rằng có lẽ cái gì sai trái với văn bản cốt truyện.

  • Thêm dấu gạch dưới và một vài ký tự khác vào bộ ký tự mặc định mà trình vệ sinh chuỗi tìm kiếm.

Hy vọng điều này sẽ hữu ích!

+0

Tuyệt vời! Tôi đã áp dụng tên ([df]) <- gsub ("_", ".", Tên ([df])) cho tất cả các khung dữ liệu sau khi đọc chúng và chấp nhận báo cáo. '_' Là do dữ liệu được xuất từ ​​MS Access, không có '.' trong tên trường là có thể. Bây giờ, nó hoạt động tốt ... vẫn còn rất nhiều tinh chỉnh để làm, nhưng về mặt kỹ thuật, mọi thứ đều tốt. Cảm ơn sự hỗ trợ và vì đã xem xét dữ liệu của tôi! :) – donodarazao

+0

+1 cho vệ sinh nhân vật tikz! – jupp0r

1

Q2: Bạn có sử dụng \pgfrealjobname{<DOCUMENTNAME>} trong tiêu đề và tùy chọn external=TRUE cho các khối đồ họa không? Tôi thấy rằng điều đó làm tăng tốc độ rất nhiều (không phải cho lần biên dịch đầu tiên, nhưng đối với những người tiếp theo nếu đồ họa không thay đổi). Bạn sẽ tìm thấy nhiều nền trong họa tiết pgfSweave.

Q3: Mọi thứ hoạt động tốt cho tôi, tôi sử dụng Windows + Eclipse/StatEt/Texlipse như bạn.

+0

Cảm ơn câu trả lời. Q2: Có, tôi đã sử dụng pgfrealname {} và external = TRUE. Dù sao, vấn đề tốc độ trong Q2 là với một đoạn không đồ họa. Q3: Thật tuyệt khi nghe rằng dường như nó thực sự có thể cấu hình mọi thứ một cách thỏa mãn ... Tôi đoán tôi phải làm một số việc nữa để đến đó. ;) – donodarazao

3

Q2: Tôi là người duy trì pgfsweave.

Dưới đây là kết quả của một thử nghiệm tôi chạy:

time R CMD Sweave time-test.Rnw 

real 0m1.133s 
user 0m1.068s 
sys  0m0.054s 

time R CMD pgfsweave time-test.Rnw 

real 0m2.941s 
user 0m2.413s 
sys  0m0.364s 

time R CMD pgfsweave time-test.Rnw 

real 0m2.457s 
user 0m2.112s 
sys  0m0.283s 

Tôi tin rằng có 2 lý do cho sự chênh lệch thời gian nhưng nó sẽ mất nhiều việc để xác minh họ chính xác:

  • pgfSweave làm một kiểm tra và kiểm tra hai lần để đảm bảo rằng nó không làm giảm tính toán đắt tiền. Mục đích là để làm cho nó khả thi để thực hiện các phép tính đắt tiền hơn và âm mưu trong một tài liệu. Quy mô của "đắt tiền" trong trường hợp này là nhiều hơn so với bổ sung thứ hai hoặc hai để làm kiểm tra.

Như một ví dụ về bộ nhớ đệm xem xét các tập tin thử nghiệm sau đây để thấy được lợi ích thực sự của bộ nhớ đệm:

\documentclass{article} 

\begin{document} 

<<plot.opts,cache=TRUE>>= 
x <- Sys.sleep(10) 
@ 

\end{document} 

Và kết quả:

time R CMD Sweave time-test2.Rnw 

real 0m10.334s 
user 0m0.283s 
sys  0m0.047s 

time R CMD pgfsweave time-test2.Rnw 

real 0m12.032s 
user 0m1.356s 
sys  0m0.349s 

time R CMD pgfsweave time-test2.Rnw 

real 0m1.423s 
user 0m1.121s 
sys  0m0.266s 
  • Sweave đã trải qua một số thay đổi trong R 2.12. Những thay đổi có thể đã tăng tốc quá trình đánh giá đoạn mã và để lại pgfSweave phía sau cho các tính toán nhỏ hơn này. Giá trị xem xét

Q3: Tôi sử dụng pgfChỉ mình luôn luôn làm việc riêng. Đã có một số thay đổi trong Sweave trong R 2.12 đã gây ra một số vấn đề nhỏ với pgfSweave nhưng một phiên bản mới sắp được sửa chữa tất cả mọi thứ. Phiên bản phát triển trên github (https://github.com/cameronbracken/pgfSweave) đã có các thay đổi. Nếu bạn gặp vấn đề khác, tôi rất sẵn lòng trợ giúp.

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