r语言 - 数据表未与 Rmd / RStudio 中的 cat 命令结合使用打印



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

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

如果您能给我一些有关如何调试的线索,那也会有所帮助。由于没有任何警告/错误消息。

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

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

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

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

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

if (TRUE) {
  1:10  # not printed
  11:20 # printed because this is the visible value returned by if()
}

最新更新