有人可以解释为什么在下面的 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 小部件(包括 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()
}