【问题标题】:Incorporating DT tables into Rmd Markdown document将 DT 表合并到 Rmd Markdown 文档中
【发布时间】:2021-05-01 09:55:21
【问题描述】:

我正在使用列表来收集一些由函数生成的 QC 图和表格,这些函数应该包含在最终的 Rmd markdown html 文档中。据我所知,该代码按预期工作。生成和收集所有绘图和表格。当整个脚本执行时,它们也会正确打印在源窗口中。

但是,当我编织文档时,只有绘图按我预期的方式包含在内,而数据表则没有。我不知道为什么以及如何解决这个问题。

下面是一个玩具示例。为这篇很长的帖子道歉,但我想展示不同的行为。

源窗口中单个图和表格的输出:

library(DT)

plot(cars)

datatable(cars)

从列表中输出图表和表格:

library(DT)

qc_tables <- list()
qc_plots <- list()

qc_plots[[length(qc_plots) + 1]] <- plot(cars)
qc_plots[[length(qc_plots) + 1]] <- plot(iris)
for (p in qc_plots) { print(p) }

qc_tables[[length(qc_tables) + 1]] <- datatable(cars)
qc_tables[[length(qc_tables) + 1]] <- datatable(iris)
for (p in qc_tables) { print(p) }

源窗口中的输出截图:

现在编织和html输出:

---
title: "R Notebook"
output:
  html_document
---

# Direct output of plots and Data.Tables

```{r}
library(DT)

plot(cars)
datatable(cars)

plot(iris)
datatable(iris)

```

# Output of plots and Data.Tables from lists

```{r}
library(DT)

qc_tables <- list()
qc_plots <- list()

qc_plots[[length(qc_plots) + 1]] <- plot(cars)
qc_plots[[length(qc_plots) + 1]] <- plot(iris)

for (p in qc_plots) { print(p) }

qc_tables[[length(qc_tables) + 1]] <- datatable(cars)
qc_tables[[length(qc_tables) + 1]] <- datatable(iris)

for (p in qc_tables) { print(p) }
```

直接输出的 Markdown 文件:

通过列表生成 Markdown 输出时缺少:

reprex package (v0.3.0) 于 2021-01-27 创建

【问题讨论】:

    标签: r r-markdown dt htmlwidgets


    【解决方案1】:

    我在这里找到了帮助: https://github.com/rstudio/DT/issues/67

    这对我有用,它不是循环,而是生成了所需的输出。
    顶部的块:

    library(knitr)
    library(DT)
    

    现在有两个选项,首先,如果您的数据在数据框中,并且您希望以相同的方式格式化它们:

    dflist <- list(iris,cars)
    htmltools::tagList(
      lapply(dflist, datatable)
    )
    

    其次,如果如 cmets 中所指出的,您提前格式化数据表并将它们放在列表中:

    qc_tables <- list()
    qc_tables[[length(qc_tables) + 1]] <- datatable(cars)
    qc_tables[[length(qc_tables) + 1]] <- datatable(iris)
    htmltools::tagList(
      lapply(qc_tables, print)
    )
    

    Rmd 的结果:

    【讨论】:

    • 谢谢布赖恩。不幸的是,这个解决方案对我不起作用。生成这些 QC 表的函数相当长且具体:它需要许多不同的数据切片,然后根据数据子集对这些表进行格式化。所以挑战是从列表中提取已经生成的表。我现在可以一一列举它们,因为表的数量没有变化。然而,这个解决方案并不是特别优雅......但它现在可以工作。
    • 我更新了我的答案以使用列表中的数据框或列表中的 DT。
    • 甜蜜!这样可行。谢谢你。接下来尝试了解为什么它不能开箱即用并且需要htmltools::tagList的额外包装...
    • 不是一个非常复杂的答案,但我认为这是因为datatable 的输出最终是一个HTML 对象,所以当有多个时你需要htmltools::tagList 来正确呈现它们。也许?
    • 感谢您的尝试,布赖恩。我只是很困惑为什么当我手动打印它们时它们似乎渲染得很好(例如print(qc_plot[[1]], qc_plot[[2]], ...),但当我表面上在for循环或通过lapply做同样的事情时却没有。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多