2013-06-18 21 views
12

Próbuję wygenerować raport HTML, używając knitr, w oparciu o skrypt R, który ma dla pętli. Chcę generować komentarze ze względu na komentarze w pętli for, ale nie jestem pewien, czy jest to możliwe.Generowanie komentarzy Markdown wewnątrz pętli

Oto prosty przykład, to jest w test.R:

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

potem użyć spin wygenerować plik RMD: wirowania ('test.R')

Jednak RMD plik wygląda następująco.

Komentarze do znaczników w obrębie porcji R nie są wkompilowane w HTML. Czy to możliwe?

Dzięki, Peter

+0

brzmi, jakbyś chciał uruchomić jakiś kod R przed konwersją do Rmd, podczas gdy ja rozumiem, że spin (a następnie knit) robi to na odwrót. Myślę, że szablony warzenia mogą pomóc tutaj. – baptiste

+1

Myślę, że naprawdę masz na myśli _roxygen_ komentarze zamiast komentarzy _Markdown_. Jak wspomniałem @ Baptiste, "napar" jest bardziej wyrafinowany dla tego rodzaju zadań (generowanie tekstu z pętli). –

+0

@Yihui, masz rację. Plik R zawiera komentarze roxygen, które, mam nadzieję, zostaną przekonwertowane na komentarze Markdown po uruchomieniu wirowania. – pmichaels

Odpowiedz

5

mam (re) wdrożone pewne cechy knitr Niezależnie od @Yihui oparciu o brew w moim pakiecie pander, które mogłyby pomóc w tych (i podobnych) kwestii, jeśli nie chcesz, aby uruchomić brew przed knit. Szybkie 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_ 

Należy pamiętać, że można również przekazać plik do Pandoc.brew (nie ma potrzeby korzystania z takiej kłopotliwej konfiguracji z text argument z rzeczywistych problemów życia), a można też użyć <% ... %> tagi np warunkowe (np. wyświetlanie lub niewyświetlanie części raportu). I co najważniejsze: istnieje ogromna różnica między <% ... %> (nieprzetworzone polecenia R) i <%= ... %> (wyniki przetwarzane są przez tagi pander). To ostatnie oznacza, że ​​wszyscy wrócili obiekty R są przekształcane do obniżki Pandoc użytkownika, np:

> 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

dzięki za sugestię. Miałem nadzieję, że w kodzie R nie będę używał zbyt wielu znaczników, ale dobrze jest wiedzieć, że istnieje jakieś obejście. – pmichaels

9

Myślę, że można uzyskać to, co chcesz w knitr z wynikami opcja Kod chunk = „Asis”, które można określić po „# +”w skrypcie R mają być przekazane do wirowania (ale kod wygląda mniej«czysty»niż ciekawe rozwiązanie zaparzania proponowanej przez @daroczig):

#+ 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)  
} 

Jeśli jest to test.R scenariusz i że robisz korkociąg ("test.R"), wynikowy plik md będzie wyglądać tak:

## 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

pozwala mi to wstawiać komentarze do wyników, ale komentarze nie są sformatowane przy użyciu notacji Markdown. – pmichaels

+0

Co masz na myśli przez komentarze sformatowane w notacji przecenowej? Czy szukasz html komentarzy? Jeśli tak, możesz zrobić to w ten sam sposób, zobacz mój edytowany przykład – Gilles

+0

(+1) Musiałem dołączyć dodatkowy 'cat ('\ n')' po 'print (i)', aby nagłówki od 2 do 5 były renderowane jako nagłówki. – jbaums

4

Jednym z rozwiązań, które zadziałało dla mnie, jest how to create a loop that includes both a code chunk and text with knitr in R. Za pomocą Zarównoresults='asis' i dwie spacje przed \n na końcu każdej pętli.

przykład:

Bez dwie przestrzenie:

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

wyjścia (HTML):

enter image description here

Jak widać, komentarze i nagłówki dostać pomieszane razem

Rozwiązanie: Z dwoma pomieszczeniami: cat(" \n") na koniec pętli

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

enter image description here

UWAGA: cat(" \n") musi być na samym końcu, to nie działa, nawet jeśli fabuła lub obliczyć coś w pętli.

Powiązane problemy