реагируемый в блоке R markdown `asis` с не отображаемым циклом

#r #r-markdown #reactable

Вопрос:

Я хочу создать динамические разделы в своем документе R markdown. Для этого я использую фрагменты R с asis типом вывода. Фрагменты содержат таблицы, созданные reactable пакетом.

Я не могу заставить таблицы печататься, когда я создаю их в цикле for. Я знаю, что обычно нужно оборачивать сюжеты или print() что-то подобное в циклы, но в моем случае это не имело никакого эффекта.

Как я могу распечатать таблицы?

 --- title: "Test" author: "Test" date: "29 11 2021" output: html_document ---  ```{r include=FALSE} library(reactable)  ```  ```{r results='asis', echo=FALSE}  cat("nn## My header 1 nn")  reactable(data.frame(test = rnorm(3))) ## This works  ```    ```{r results='asis', echo=FALSE}    for (i in 1:3) {    cat("nn## My header ", i 1, "nn")    print(reactable(data.frame(test = rnorm(3)))) ## shows nothing   }  ```  

Ответ №1:

Я только что узнал, что reactable использует htmlwidgets под капотом. Таким образом, можно обернуть результат, shiny::tagList() чтобы отобразить его в цикле.

 --- title: "Test" author: "Test" date: "29 11 2021" output: html_document ---  ```{r include=FALSE} library(reactable)  ```  ```{r results='asis', echo=FALSE}  cat("nn## My header 1 nn")  reactable(data.frame(test = rnorm(3))) ## This works  ```    ```{r results='asis', echo=FALSE}   for (i in 1:3) {    cat("nn## My header ", i 1, "nn")    print(shiny::tagList(reactable(data.frame(test = rnorm(3))))) ## now it works   }  ```  

Комментарии:

1. Спасибо! Это делает свое дело. Кстати, список тегов определен в htmltools и экспортирован в shiny, поэтому htmltools::Список тегов будет еще более «прямым».

Ответ №2:

Вы можете попытаться экспортировать свои таблицы реакции в виде временных html-файлов, которые затем импортируете в виде текста и впоследствии удаляете.

Вот решение, которое сработало для меня:

 --- title: "Test" author: "Test" date: "29 11 2021" output: html_document ---  ```{r include=FALSE} library(reactable)  ```  ```{r results='asis', echo=FALSE}  cat("nn## My header 1 nn")  reactable(data.frame(test = rnorm(3))) ## This works  ```     ```{r results='asis', echo=FALSE}    for (i in 1:3) {   cat("nn## My header ", i 1, "nn")   htmlwidgets::saveWidget(reactable(data.frame(test = rnorm(3))),  file = 'temp.html')  cat(readr::read_lines('temp.html')[-1])  file.remove('temp.html') }  ```  

Комментарии:

1. Это тоже хорошая идея, спасибо! Это, вероятно, также полезно для широкого спектра выходов, а не только для реагирования.