数据表未与 Rmd / RStudio 中的 cat 命令结合打印

Datatable is not printed in combination with cat command in Rmd / RStudio

有人可以解释为什么在下面的 Rmd 代码(使用 RStudio 生成 HTML 报告)中只显示 cat 命令吗?当我将 cat 命令移到 if 子句之外或将其注释掉时,会打印 table 。我相信使用 library(printr) 时会发生同样的事情,但我还没有用最少的样本证实这一点。

似乎 if 子句中的代码以某种方式一起解释,并且 catdatatable 不相配。

如果你能给我一些关于如何调试它的线索,那也会很有帮助。因为根本就没有 warnings/error 条消息。

---
title: "test"
output: 
  html_document
---


```{r}
if(TRUE){
  DT::datatable(iris)
  cat("I am here with my cat")
}

```

这与 knitr#1137. HTML widgets 本质上是同一个问题,包括 DT/DataTables,仅当它们是从 顶级 R 表达式生成时才有效。这是因为实际上只有顶级表达式被 打印出来 。不在顶层的表达式仅被 求值 。这两种情况有很大的不同。打印涉及调用打印功能。在大多数情况下,毫不奇怪,此函数是 print()(或 show() 用于 S4 对象)。在knitr的世界里,它比那个更复杂:默认的打印函数是knitr::knit_print,和print()非常相似,但是它多做了一件事除了生成文本输出之外,它还收集正在打印的对象的元数据(例如 HTML 依赖项)。编织完成后,rmarkdown 会将元数据解析为适当的 HTML 代码(例如 <head> 中的 <script src="dataTables.js"></script>)。

综上所述,如果表达式不在顶层,则既不会打印也不会收集元数据,因此无法真正呈现小部件。

一个简单的例子来说明这一点:

if (TRUE) {

  1:10  # not printed

  11:20 # printed because this is the visible value returned by if()

}