有人可以解释一下为什么在下面的 Rmd 代码(使用 RStudio 生成 HTML 报告)中只显示 cat
命令吗?当我将 cat
命令移到 if
子句之外或将其注释掉时,就会打印该表。我相信使用library(printr)
时也会发生同样的事情,但我还没有用最小的样本证实这一点。
似乎 if
子句中的代码以某种方式一起解释,并且 cat
与 datatable
的配合不太好。
如果您能给我一些有关如何调试此问题的线索,那也会很有帮助。因为没有任何警告/错误消息。
---
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 代码(例如 <script src="dataTables.js"></script>
中的 <head>
)。
综上所述,如果表达式不在顶层,则打印和元数据收集都不会完成,因此组件无法真正渲染。
一个简单的例子来说明这一点:
if (TRUE) {
1:10 # not printed
11:20 # printed because this is the visible value returned by if()
}
关于r - 在 Rmd/RStudio 中与 cat 命令结合使用时不打印数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35176098/