2015-10-21 5 views
26

Ho un documento R Markdown in questo modo:Loop in R Markdown

The following graph shows a histogram of variable x: 

```{r} 
hist(x) 
``` 

voglio introdurre un ciclo, in modo da poter fare la stessa cosa per più variabili. Qualcosa ipoteticamente così:

for i in length(somelist) { 
    output paste("The following graph shows a histogram of somelist[[" , i, "]]") 
    ```{r} 
    hist(somelist[[i]]) 
    ``` 

È possibile?

PS: Il piano più grande è quello di creare un programma che passi su un frame di dati e generi automaticamente i riepiloghi appropriati per ogni colonna (ad esempio istogramma, tabelle, grafici a riquadri, ecc.). Il programma può quindi essere utilizzato per generare automaticamente un documento markdown che contiene l'analisi esplorativa che si farebbe quando si vedono i dati per i primi dati.

+0

È possibile generare più grafici all'interno di un blocco. Potresti spiegare qual è il fondamento logico della tua soluzione invece di avere un loop all'interno di un blocco che produce più trame? – akhmed

+1

Sono venuto qui per la stessa domanda. La mia motivazione è quella di produrre diverse versioni di un rapporto RMarkdown. Le relazioni saranno la risposta per un esercizio dato ai miei studenti, ma dal momento che ognuno lavora con dati diversi, voglio personalizzare i report per ogni studente. La risposta accettata può essere utile, ma sarebbe meglio avere effettivamente markdown all'interno del ciclo, per utilizzare funzionalità di markdown come didascalie, formule, formattazione e così via. – Pere

risposta

26

Potrebbe essere quello che vuoi?

--- 
title: "Untitled" 
author: "Author" 
output: html_document 
--- 


```{r, results='asis'} 
for (i in 1:2){ 
cat('\n') 
cat("#This is a heading for ", i, "\n") 
hist(cars[,i]) 
cat('\n') 
} 
``` 

Questa risposta è stata più o meno rubata dal here.

+0

Non è chiaro (almeno per me) dall'altra risposta che questo potrebbe essere fatto nel markdown senza dover prima ricucire insieme un file R. È bello vedere che posso limitarmi a RMarkdown ora. –

+0

Per me, le due intestazioni appaiono prima di entrambi i grafici. – Nova

+0

Riesegui questo codice con la versione del pacchetto corrente. Per me funziona ancora. Hai modificato il codice di esempio in qualche modo? – Alex

1

Come già accennato, qualsiasi loop deve essere inserito in un blocco di codice. Potrebbe essere più semplice assegnare all'istogramma un titolo piuttosto che aggiungere una riga di testo come intestazione per ognuno.

```{r} 
    for i in length(somelist) { 
     title <- paste("The following graph shows a histogram of somelist[[" , i, "]]") 
     hist(somelist[[i]], main=title) 
    } 
``` 

Tuttavia, se si desidera creare più rapporti quindi controllare this thread.

che ha anche un link per this example.
Sembra quando la chiamata di rendering è realizzata all'interno di una sacca, le variabili ambientali può essere passato al file Rmd.

Così un'alternativa potrebbe essere quella di avere lo script R:

for i in length(somelist) { 
    rmarkdown::render('./hist_.Rmd', # file 2 
       output_file = paste("hist", i, ".html", sep=''), 
       output_dir = './outputs/') 
} 

E poi il tuo pezzo Rmd sarà simile:

```{r} 
    hist(i) 
``` 

Disclaimer: non ho ancora testato questo.