2015-11-13 15 views
5

Tôi muốn có thể in ra danh sách các ô không được xác định trước trong đan. Tôi am có thể làm điều đó, nhưng có một vài nếp nhăn còn lại để ủi. Cụ thể:In danh sách các ô có kích thước động trong knitr

1) Làm cách nào để bạn chặn các chỉ mục danh sách (như [[2]]) trên mỗi trang đứng trước mỗi ô? Sử dụng echo = FALSE không làm gì cả.

2) Có thể đặt kích thước cho mỗi ô khi chúng được hiển thị không? Tôi đã cố gắng thiết lập một biến kích thước bên ngoài của đoạn, nhưng điều đó chỉ cho phép tôi sử dụng một giá trị và không phải là một giá trị khác nhau cho mỗi lô.

Tôi hỏi đây là một câu hỏi vì chúng dường như nói cùng một bài học, tức là, tạo ra một danh sách các ô.

Một số mẫu mã:

\documentclass{article} 
\usepackage[margin=.5in, landscape]{geometry} 
\begin{document} 

<<diamond_plots, echo = FALSE, results = 'hide'>>== 
library(ggplot2) 

diamond_plot = function(data, cut_type){ 
    ggplot(data, aes(color, fill=cut)) + 
    geom_bar() + 
    ggtitle(paste("Cut:", cut_type, sep = "")) 
} 

cuts = unique(diamonds$cut) 
plots = list() 
for(i in 1:length(cuts)){ 
    data = subset(diamonds, cut == cuts[i]) 
    plots[[i]] = diamond_plot(data, cuts[i]) 
} 
height = 3 
@ 

<<print_plots, results='asis', echo=FALSE, fig.width=10, fig.height=height>>= 
plots 
@ 
\end{document} 

PDF của lô trông như thế này:

enter image description here

Trả lời

6

1) Làm thế nào để bạn loại bỏ các chỉ mục danh sách (như [[2]]) trên mỗi trang đứng trước mỗi ô? Sử dụng echo = FALSE không làm gì cả.

Lô mỗi phần tử trong danh sách riêng (lapply) và ẩn các đầu ra từ lapply (invisible):

invisible(lapply(plots, print)) 

2) Có thể thiết lập kích thước cho từng lô như họ đang có kết xuất? Tôi đã thử thiết lập một biến kích thước bên ngoài của đoạn, nhưng điều đó chỉ cho phép tôi sử dụng một giá trị và không phải là một giá trị khác nhau cho mỗi lô.

Có. Nói chung, khi bạn chuyển vectơ cho các tùy chọn đoạn liên quan đến hình, phần tử ith được sử dụng cho ô ith. Điều này áp dụng cho các tùy chọn "cụ thể hình" như ví dụ: fig.cap, fig.scap, out.widthout.height.

Tuy nhiên, các tùy chọn hình khác là "thiết bị cụ thể". Để hiểu điều này, điều quan trọng là để có một cái nhìn tại các optiondev:

dev: tên hàm đó sẽ được sử dụng như một thiết bị đồ họa để ghi lại âm mưu [...] các tùy chọn dev, fig.ext, fig.width, fig.heightdpi có thể là vectơ (các vectơ ngắn hơn sẽ được tái chế), ví dụ<<foo, dev=c('pdf', 'png')>>= tạo ra hai tập tin cho cốt truyện giống nhau: foo.pdffoo.png

Trong khi đi qua một vector với "con số cụ thể" tùy chọn out.height có hậu quả của yếu tố ithứ được sử dụng cho ithứcốt truyện, đi qua một vector vào tùy chọn "thiết bị cụ thể" có hậu quả của các yếu tốithứ được sử dụng cho ithứdev băng.

Do đó, tạo ra âm mưu động có kích thước cần một số tấn công vào khối vì một đoạn không thể tạo lô với fig.height cài đặt khác nhau. Giải pháp sau dựa trên ví dụ knitr`075-knit-expand.Rnwthis post on r-bloggers.com (giải thích this answer on SO).

Ý tưởng của giải pháp là sử dụng mẫu đoạn và mở rộng các giá trị mẫu với các biểu thức thích hợp để tạo các khối, đến lượt nó, tạo ra các ô với cài đặt fig.height phù hợp. Mẫu mở rộng sẽ được chuyển cho knit để đánh giá các đoạn:

\documentclass{article} 
\begin{document} 

<<diamond_plots, echo = FALSE, results = "asis">>== 
library(ggplot2) 
library(knitr) 

diamond_plot = function(data, cut_type){ 
    ggplot(data, aes(color, fill=cut)) + 
    geom_bar() + 
    ggtitle(paste("Cut:", cut_type, sep = "")) 
} 

cuts = unique(diamonds$cut) 

template <- "<<plot-cut-{{i}}, fig.height = {{height}}, echo = FALSE>>= 
    data = subset(diamonds, cut == cuts[i]) 
    plot(diamond_plot(data, cuts[i])) 
@" 

for (i in seq_along(cuts)) { 
    cat(knit(text = knit_expand(text = template, i = i, height = 2 * i), quiet = TRUE)) 
} 

@ 

\end{document} 

Mẫu được mở rộng sử dụng knit_expand thay thế các biểu thức trong {{}} bởi các giá trị tương ứng.

Đối với cuộc gọi knit, điều quan trọng là sử dụng quite = TRUE. Nếu không, knit sẽ gây ô nhiễm tài liệu chính với thông tin nhật ký.

Sử dụng cat là điều quan trọng để tránh ngầm định print có thể làm mất hiệu lực đầu ra khác. Vì lý do tương tự, đoạn "bên ngoài" (diamond_plots) sử dụng results = "asis".

+0

Được bình chọn và chấp nhận, mặc dù tôi sẽ lưu ý (như bạn đã làm, quá!) Mà tôi thấy sự biến dạng đáng kể vì out.height vs fig.height. Nếu tôi/ai đó có thể tìm ra cách để có được xung quanh sự biến dạng đó sẽ là sao - Tôi sẽ báo cáo lại nếu tôi tìm ra nó. – Nancy

+0

Lỗi tôi nhận được khi tôi cố gắng đặt fig.height là biến là "Lỗi trong các tùy chọn [[sprintf (" fig.% S ", i)]] * tùy chọn $ dpi:" – Nancy

+0

Thông báo lỗi này sẽ chỉ xảy ra nếu bạn vượt qua một cái gì đó như 'paste0 (seq_along (cắt) * 4," cm ")' thành 'fig.height'. Điều này là do 'fig.height' phải là số; 'fig.height = seq_along (vết cắt)' * nên * hoạt động (IMHO), nhưng không làm gì cả. –

0

Bạn cần phải truy cập vào các yếu tố danh sách cá nhân, nếu không in sẽ luôn in ra các chỉ số .

Không chắc đó có phải là câu trả lời rõ ràng nhất nhưng bạn có thể in chúng qua vòng lặp.

> print(plots) 
[[1]] 

[[2]] 

[[3]] 

[[4]] 

[[5]] 

> for(x in plots){print(x)} 

Nhưng tôi không thử điều này trong tex, chỉ là bảng điều khiển.

+0

Thật kỳ lạ, các chỉ số vẫn hiển thị. Tôi mơ hồ nhớ đã thử điều đó trước đây và ngạc nhiên. Bất kỳ suy nghĩ về thay đổi động fig.height? – Nancy

+0

Không phải những suy nghĩ thú vị. Tôi làm hầu hết các đầu ra của tôi trong markdown và tôi phải đặt html bản thân mình nếu tôi muốn tự động hóa kích thước của một cốt truyện bởi vì bạn không thể vượt qua các tham số cho khối đan. Nếu bạn chỉ có 5 ô, hãy làm theo cách thủ công (các khối mã r riêng lẻ). Nếu không, làm một, hãy nhìn vào mủ thô, và sao chép đó, thay đổi các thông số bạn cần và sau đó tiêm trực tiếp bằng cách sử dụng mã r. Tôi tin rằng lá cờ 'asis' cho phép bạn vượt qua đầu ra latex trực tiếp từ một hàm r – intra

+0

Hm thú vị. Thật không may tôi đang cố gắng viết cho một ứng dụng sẽ được hoàn toàn tự động với các đầu vào khác nhau. Tôi có thể chỉ cần đặt kích thước hình thành một số không đổi và sau đó cắt dữ liệu để phù hợp với kích thước hình như trái ngược với nghịch đảo. – Nancy

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