2013-06-18 14 views
12

Sto provando a generare un report HTML, utilizzando knitr, basato su uno script R che ha cicli for. Voglio generare commenti markdown dai commenti all'interno del ciclo for, ma non sono sicuro che sia possibile.genera commenti markdown all'interno del ciclo

Ecco semplice esempio, questo è in test.R:

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

allora io uso di selezione per generare un file Rmd: di spin ('test.R')

Tuttavia, il Rmd il file è simile al seguente.

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

I commenti markdown all'interno del blocco R non sono compilati in HTML. È possibile?

Grazie, Peter

+0

sembra che tu voglia eseguire un codice R prima della conversione in Rmd, mentre come ho capito girare (seguito da knit) fa il contrario. Penso che i modelli di birra possano aiutare qui. – baptiste

+1

Penso che intendiate veramente i commenti _roxygen_ invece dei commenti _Markdown_. Come menzionato da @baptiste, 'brew' è più sofisticato per questo tipo di attività (genera un testo da un ciclo). –

+0

@Yihui, hai ragione. Il file R contiene commenti di roxygen, che spero saranno convertiti in commenti Markdown dopo che ho eseguito lo spin. – pmichaels

risposta

5

ho (ri) implementato alcune caratteristiche della knitr indipendentemente dalla @Yihui basate su brew nel mio pacchetto pander che potrebbe aiutare con tali (e simili) problemi se non si vuole correre brew prima del knit ting. demo rapida:

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

Si prega di notare che si potrebbe anche passare un file di Pandoc.brew (non c'è bisogno di utilizzare tale impostazione problematico con l'argomento text con i problemi della vita reale), e che si potrebbe anche usare <% ... %> tag per esempio condizionali (come mostrare o non rendere parte di un report). E, cosa più importante: c'è un'enorme differenza tra <% ... %> (comandi R non elaborati) e <%= ... %> (i risultati vengono elaborati dai tag pander). Quest'ultimo significa che tutti tornati gli oggetti R sono trasformati in Markdown di Pandoc, ad esempio:

> 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

grazie per il suggerimento. Speravo di evitare di usare troppi tag espliciti nel codice R, ma è bene sapere che c'è un problema. – pmichaels

9

Penso che si può ottenere ciò che si desidera in knitr con i risultati di opzione codice pezzo = 'Asis' che è possibile specificare dopo "# +" in uno script R da passare a girare (ma il codice sembra meno 'pulita' rispetto alla soluzione interessante birra proposta da @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)  
} 

Se questa è la test.R sceneggiatura e che si fa girare ("test.R"), il file md risultante sarà simile al seguente:

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

questo mi permette di inserire commenti nell'output, ma i commenti non sono formattati usando la notazione Markdown. – pmichaels

+0

Cosa intendi per commenti formattati con la notazione markdown? Sono i commenti html che stai cercando? Se sì, puoi farlo allo stesso modo, vedi il mio esempio modificato – Gilles

+0

(+1) Avevo bisogno di includere un ulteriore 'cat ('\ n')' dopo 'print (i)' per le intestazioni da 2 a 5 da rendere come titoli. – jbaums

4

Una soluzione che ha funzionato per me è fornita da how to create a loop that includes both a code chunk and text with knitr in R. Utilizzando Entrambiresults='asis' e due spazi davanti a \n alla fine di ogni ciclo.

esempio:

Senza due spazi:

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

di output (HTML):

enter image description here

Come si può vedere, i commenti e le intestazioni avere messo insieme

Soluzione: Con due spazi: cat(" \n") alla fine del ciclo

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

enter image description here

nota: cat(" \n") ha bisogno di essere proprio alla fine, non funziona anche se si trama o calcolare qualcosa nel ciclo.