Home > Enterprise >  reactable in R markdown `asis` chunk with loop not displayed
reactable in R markdown `asis` chunk with loop not displayed

Time:11-30

I want to create dynamic sections in my R markdown document. For this, I use R chunks with the asis output type. The chunks contain tables created by the reactable package.

I cannot get the tables to print when I create them in a for-loop. I know that one usually must wrap plots or the like within print() in loops, but that had no effect in my case.

How can I get the tables to print?

---
title: "Test"
author: "Test"
date: "29 11 2021"
output: html_document
---

```{r include=FALSE}
library(reactable)

```

```{r results='asis', echo=FALSE}

cat("\n\n## My header 1 \n\n")

reactable(data.frame(test = rnorm(3)))  ## This works

```



```{r results='asis', echo=FALSE}



for (i in 1:3) {
  
  cat("\n\n## My header ", i 1, "\n\n")
  
  print(reactable(data.frame(test = rnorm(3))))  ## shows nothing
  
}

```

CodePudding user response:

I just found out, that reactable uses htmlwidgets under the hood. So one can wrap the result in shiny::tagList() to display it in a loop.

---
title: "Test"
author: "Test"
date: "29 11 2021"
output: html_document
---

```{r include=FALSE}
library(reactable)

```

```{r results='asis', echo=FALSE}

cat("\n\n## My header 1 \n\n")

reactable(data.frame(test = rnorm(3)))  ## This works

```



```{r results='asis', echo=FALSE}


for (i in 1:3) {
  
  cat("\n\n## My header ", i 1, "\n\n")
  
  print(shiny::tagList(reactable(data.frame(test = rnorm(3)))))  ## now it works
  
}

```

CodePudding user response:

You could try to export your react-tables as temporary html-files that you then import as text and delete afterwards.

Here is a solution that worked for me:

---
title: "Test"
author: "Test"
date: "29 11 2021"
output: html_document
---

```{r include=FALSE}
library(reactable)

```

```{r results='asis', echo=FALSE}

cat("\n\n## My header 1 \n\n")

reactable(data.frame(test = rnorm(3)))  ## This works

```




```{r results='asis', echo=FALSE}



for (i in 1:3) {

  cat("\n\n## My header ", i 1, "\n\n")

  htmlwidgets::saveWidget(reactable(data.frame(test = rnorm(3))),
                          file = 'temp.html')
  cat(readr::read_lines('temp.html')[-1])
  file.remove('temp.html')
}

```
  • Related