Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop in R markdown

I have an R markdown document like this:

The following graph shows a histogram of variable x:

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

I want to introduce a loop, so I can do the same thing for multiple variables. Something hypothetically like this:

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

Is that even possible?

PS: The greater plan is to create a program that would go over a data frame and automatically generates appropriate summaries for each column (e.g. histogram, tables, box plots, etc). The program then can be used to automatically generate a markdown document that contains the exploratory analysis you would do when seeing a data for the first data.

like image 850
Merik Avatar asked Oct 21 '15 21:10

Merik


2 Answers

Could that be what you want?

---
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') 
}
```

This answer was more or less stolen from here.

like image 116
Alex Avatar answered Nov 01 '22 17:11

Alex


As already mentioned, any loop needs to be in a code chunk. It might be easier to to give the histogram a title rather than add a line of text as a header for each one.

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

However, if you would like to create multiple reports then check out this thread.

Which also has a link to this example.
It seems when the render call is made from within a script, the environmental variables can be passed to the Rmd file.

So an alternative might be to have your R script:

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

And then your Rmd chunk would look like:

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

Disclaimer: I haven't tested this.

like image 5
Will Hore-Lacy Avatar answered Nov 01 '22 16:11

Will Hore-Lacy