2015-05-24 16 views
7

Tôi muốn tạo một vòng lặp, cho phép tôi tự động lưu các báo cáo PDF, được tạo từ một tệp .Rmd. Ví dụ: nếu biến "ID" có 10 hàng, tôi muốn R tự động lưu 10 báo cáo vào một thư mục cụ thể. Các báo cáo này sẽ thay đổi dựa trên ID được chọn.R Knitr PDF: Có khả năng tự động lưu các báo cáo PDF (được tạo từ .Rmd) thông qua một vòng lặp không?

Bài đăng trước (Using loops with knitr to produce multiple pdf reports... need a little help to get me over the hump) đã xử lý việc tạo nhiều báo cáo pdf được tạo từ các tệp .Rnw. Tôi cố gắng để áp dụng phương pháp này như sau:

#Data 

```{r, include=FALSE} 
set.seed(500) 
Score <- rnorm(40, 100, 15) 
Criteria1<-rnorm(40, 10, 5) 
Criteria2<-rnorm(40, 20, 5) 
ID <- sample(1:1000,8,replace=T) 
df <- data.frame(ID,Score,Criteria1,Criteria2) 

#instead of manually choosing the ID: 

subgroup<- subset(df, ID==1) 

# I would like to subset the Data through a loop. My approach was like like this: 

for (id in unique(df$ID)){ 
subgroup<- df[df$ID == id,]} 

``` 

```{r, echo=FALSE} 
#Report Analysis 

summary(subgroup) 
``` 
#Here will be some text about the summary. 



# At the end the goal is to produce automatic pdf reports with the ID name as a filename: 

library("rmarkdown") 
render("Automated_Report.rmd",output_file = paste('report.', id, '.pdf', sep='')) 
+0

Bạn cần một vòng lặp, không cần hai. Cách mã của bạn được thiết lập, bạn lặp qua tất cả các nhóm con của bạn, và sau đó khi bạn hoàn thành việc tạo một nhóm các tệp PDF. Bạn cần phải kết hợp chúng: chọn một nhóm con và tạo một báo cáo dựa trên tất cả trong cùng một vòng lặp. Nếu bạn cần thêm trợ giúp, bạn sẽ phải cụ thể hơn nhiều so với "có vẻ không hoạt động" và có thể tạo một ví dụ có thể tái sản xuất. – Gregor

+0

Bạn cũng có thể xem gói 'knit_expand' hoặc' brew'. – Gregor

+0

Tôi cũng đã thử nó chỉ với một vòng lặp cho việc subsetting. Nhưng điều đó cũng không hiệu quả. Tôi đã cung cấp một ví dụ tái tạo đơn giản, chỉ dán bản tóm tắt cho mỗi ID trong một báo cáo và cũng trao đổi hàm knit2pdf() với hàm render() từ gói rmarkdown @ Gregor – user3491036

Trả lời

8

Thích ứng với ví dụ của bạn:

Bạn cần một "mẫu" tập tin .rmd. Nó có thể là một cái gì đó như thế này, lưu nó như template.rmd.

This is a subgroup report. 

```{r, echo=FALSE} 
#Report Analysis 
summary(subgroup) 
``` 

Sau đó, bạn cần một kịch bản R sẽ nạp dữ liệu mà bạn muốn, lặp qua các tập con dữ liệu, và cho mỗi tập con

  1. Xác định đối tượng subgroup sử dụng bên trong mẫu
  2. làm mẫu đến đầu ra mong muốn

Vì vậy, trong riêng biệt này:

# load data 
set.seed(500) 
Score <- rnorm(40, 100, 15) 
Criteria1<-rnorm(40, 10, 5) 
Criteria2<-rnorm(40, 20, 5) 
ID <- sample(1:1000,8,replace=T) 
df <- data.frame(ID,Score,Criteria1,Criteria2) 

library("rmarkdown") 

# in a single for loop 
# 1. define subgroup 
# 2. render output 
for (id in unique(df$ID)){ 
    subgroup <- df[df$ID == id,] 
    render("template.rmd",output_file = paste0('report.', id, '.html'))  
} 

Điều này tạo ra 8 tệp html trong thư mục làm việc của tôi, mỗi tệp có một bản tóm tắt một tập con dữ liệu khác.

Lưu ý rằng điều này sẽ không hoạt động nếu bạn thử nhấp vào nút "đan" bên trong RStudio, khi chạy mã R trong một phiên R riêng biệt. Tuy nhiên, khi bạn chạy từ giao diện điều khiển rõ ràng bằng cách sử dụng render (hoặc knit2pdf) mã R trong tệp rmd vẫn có quyền truy cập vào môi trường toàn cục.

Một tùy chọn khác để hoàn thành mục tiêu này là sử dụng gói brew.

+0

Cảm ơn @Gregor đã làm việc này! Tôi đoán bạn đã chọn .html vì .pdf đã tạo ra lỗi dựa trên kết quả đầu ra của bản tóm tắt. Vì đây chỉ là một ví dụ đơn giản, nó đã không tạo ra sự khác biệt trong phần cuối. – user3491036

+0

Yup, tôi đã tìm ra điều này là tốt để tìm ra các nguyên tắc chung và chi tiết nội dung sẽ dễ dàng theo dõi. – Gregor

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