【问题标题】:reactable in R markdown `asis` chunk with loop not displayed可在 R markdown `asis` 块中反应,不显示循环
【发布时间】:2022-01-06 03:49:35
【问题描述】:

我想在我的 R markdown 文档中创建动态部分。为此,我使用带有asis 输出类型的R 块。这些块包含由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("\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
  
}

```

【问题讨论】:

    标签: r r-markdown reactable


    【解决方案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("\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
      
    }
    
    ```
    

    【讨论】:

    • 谢谢!这就是诀窍。顺便说一句,tagList 在 htmltools 中定义并导出到闪亮,因此 htmltools::tagList 会更加“直接”。
    【解决方案2】:

    您可以尝试将您的 react-tables 导出为临时 html 文件,然后将其作为文本导入并在之后删除。

    这是一个对我有用的解决方案:

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

    【讨论】:

    • 这也是个好主意,谢谢!它可能对各种各样的输出也很有用,不仅是可反应的。
    猜你喜欢
    • 2020-03-16
    • 2019-10-26
    • 1970-01-01
    • 2016-01-21
    • 2020-12-11
    • 2018-06-09
    • 2018-05-21
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多