有人可以解释为什么在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")
}
```
答案 0 :(得分:6)
这与knitr#1137基本相同。 HTML widgets(包括DT / DataTables)仅在从顶级 R表达式生成时才起作用。这是因为只有顶层表达式实际上是打印。不在顶级的表达式仅评估。这两种情况有很大的不同。打印涉及调用打印功能。在大多数情况下,对于S4对象,此函数毫不奇怪print()
(或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()
}