2013-06-18 33 views
12

Tôi đang cố gắng tạo báo cáo HTML, sử dụng knitr, dựa trên một tập lệnh R có sẵn cho vòng lặp. Tôi muốn tạo ra các bình luận markdown từ các bình luận trong vòng lặp for, nhưng tôi không chắc chắn nếu nó có thể.tạo các nhận xét đánh dấu trong vòng lặp

Dưới đây là ví dụ đơn giản, đây là trong test.R:

for (i in 1:5) { 
    ## This is a heading for `i` 
    #' This is a comment for `i` 
    print(i)  
} 

Sau đó, tôi sử dụng quay để tạo ra một tập tin RMD: quay ('test.R')

Tuy nhiên, RMD tệp trông giống như sau.

```{r } 
for (i in 1:5) { 
    ## This is a heading for `i` 
    #' This is a comment for `i` 
    print(i)  
} 
``` 

Nhận xét đánh dấu trong đoạn R không được biên dịch sang HTML. Có thể không?

Cảm ơn, Peter

+0

có vẻ như bạn muốn chạy một số mã R trước khi chuyển đổi sang Rmd, trong khi tôi hiểu nó quay (theo sau là đan) thì có phải cách khác không. Tôi nghĩ rằng các mẫu bia có thể giúp ích ở đây. – baptiste

+1

Tôi nghĩ rằng bạn thực sự có nghĩa là ý kiến ​​_roxygen_ thay vì _Markdown_ ý kiến. Như @ baptiste đã đề cập, 'brew' tinh vi hơn cho loại công việc này (tạo văn bản từ một vòng lặp). –

+0

@Yihui, bạn là chính xác. Các tập tin R chứa các ý kiến ​​roxygen, mà tôi hy vọng sẽ được chuyển đổi sang bình luận Markdown sau khi tôi chạy spin. – pmichaels

Trả lời

5

Tôi có (lại) thực hiện một số tính năng của knitr một cách độc lập từ @Yihui dựa trên brew trong gói pander tôi có thể giúp các vấn đề như vậy (và tương tự) nếu bạn không muốn chạy brew trước knit ting. Nhanh demo:

> Pandoc.brew(text = "# Demonstrating a nice loop 
+ <% for (i in 1:5) { %> 
+ ## This is a header for <%=i%> 
+ #' This is a comment for <%=i%> 
+ <% } %>") 

# Demonstrating a nice loop 

## This is a header for _1_ 
#' This is a comment for _1_ 

## This is a header for _2_ 
#' This is a comment for _2_ 

## This is a header for _3_ 
#' This is a comment for _3_ 

## This is a header for _4_ 
#' This is a comment for _4_ 

## This is a header for _5_ 
#' This is a comment for _5_ 

Xin lưu ý rằng bạn cũng có thể vượt qua một tập tin để Pandoc.brew (không cần phải sử dụng thiết lập rắc rối như vậy với text tranh cãi với những vấn đề thực tế cuộc sống), và bạn cũng có thể sử dụng <% ... %> thẻ cho ví dụ điều kiện (như hiển thị hoặc không hiển thị một phần của báo cáo). Và quan trọng nhất: có sự khác biệt lớn giữa các lệnh <% ... %> (các lệnh R chưa xử lý) và <%= ... %> (các kết quả được xử lý bởi pander). Sau đó có nghĩa rằng tất cả trở lại đối tượng R được chuyển thành markdown Pandoc của, ví dụ:

> Pandoc.brew(text = "# Demonstrating a conditional 
+ <% for (i in 1:5) { %> 
+ ## This is a header for <%=i%> 
+ <% if (i == 3) { %> 
+ Hey, that's **almost** <%=pi%>, that's between <%=3:4%>! Wanna fit a model to _celebrate_? 
+ <%= lm(mpg ~ hp, mtcars) %> 
+ <% }} %>") 
# Demonstrating a conditional 

## This is a header for _1_ 

## This is a header for _2_ 

## This is a header for _3_ 

Hey, that's **almost** _3.142_, that's between _3_ and _4_! Wanna fit a model to _celebrate_? 

-------------------------------------------------------------- 
    &nbsp;  Estimate Std. Error t value Pr(>|t|) 
----------------- ---------- ------------ --------- ---------- 
    **hp**  -0.06823 0.01012  -6.742 1.788e-07 

**(Intercept)**  30.1  1.634  18.42 6.643e-18 
-------------------------------------------------------------- 

Table: Fitting linear model: mpg ~ hp 

## This is a header for _4_ 

## This is a header for _5_ 
+0

cảm ơn đề xuất. Tôi đã hy vọng tránh sử dụng quá nhiều thẻ rõ ràng trong mã R, nhưng thật tuyệt khi biết có một công việc xung quanh. – pmichaels

9

Tôi nghĩ rằng bạn có thể có được những gì bạn muốn trong knitr với kết quả tùy chọn mã đoạn = 'Asis' mà bạn có thể chỉ định sau khi "# +" trong một kịch bản R được thông qua để quay (nhưng mã có vẻ ít 'sạch' hơn so với giải pháp thú vị brew bởi @daroczig đề xuất):

#+ results='asis', echo = FALSE 
for (i in 1:5) { 
    cat("## This is a heading for ", i, "\n") 
    cat("<!-- This is a comment for ", i, "-->\n") 
    print(i)  
} 

Nếu đây là test.R kịch bản và rằng bạn làm quay ("test.R"), tệp md kết quả sẽ trông giống như sau:

## This is a heading for 1 
<!-- This is a comment for 1 --> 
[1] 1 
## This is a heading for 2 
<!-- This is a comment for 2 --> 
[1] 2 
## This is a heading for 3 
<!-- This is a comment for 3 --> 
[1] 3 
## This is a heading for 4 
<!-- This is a comment for 4 --> 
[1] 4 
## This is a heading for 5 
<!-- This is a comment for 5 --> 
[1] 5 
+0

điều này cho phép tôi đưa nhận xét vào đầu ra, nhưng các chú thích không được định dạng bằng ký hiệu Markdown. – pmichaels

+0

Bạn có ý gì khi nhận xét được định dạng bằng ký hiệu đánh dấu? Có phải html comment mà bạn đang tìm kiếm không? Nếu có, bạn có thể làm theo cách tương tự, xem ví dụ đã chỉnh sửa của tôi – Gilles

+0

(+1) Tôi cần thêm 'cat ('\ n')' sau 'in (i) 'cho các tiêu đề từ 2 đến 5 để hiển thị như tiêu đề. – jbaums

4

Một giải pháp phù hợp với tôi, được cung cấp bởi how to create a loop that includes both a code chunk and text with knitr in R. Bằng cách sử dụng Cả hairesults='asis' và hai khoảng trống trước \n ở cuối mỗi vòng lặp.

dụ:

Nếu không có hai không gian:

```{r, results='asis'} 
headers <- list("We","are","your","friends") 
for (i in headers){ 
    cat("\n##H ", i, " \n") 
    cat("comment",i) 
} 

Output (html):

enter image description here

Như bạn thấy, các ý kiến ​​và đề mục được sai lầm cùng

Giải pháp: Với hai không gian: cat(" \n") ở phần cuối của vòng lặp

for (i in headers){ 
    cat("\n##H ", i, "\n") 
    cat("comment",i) 
    cat(" \n")# <--------------------------------- 
} 

enter image description here

lưu ý: cat(" \n") cần phải được ít phút cuối, nó không hoạt động ngay cả khi bạn âm mưu hoặc tính toán thứ gì đó trong vòng lặp.