【问题标题】:Datatable is not printed in combination with cat command in Rmd / RStudio数据表未与 Rmd / RStudio 中的 cat 命令结合打印
【发布时间】:2016-05-12 14:15:08
【问题描述】:

有人能解释一下为什么在下面的 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")
}

```

【问题讨论】:

  • 隐式打印在 for 循环和 if 块中不起作用。在这些情况下,您需要使用print (object) 显式打印对象
  • 对不起,我不明白.... print(DT::datatable(iris)) 不工作
  • 这让我很吃惊。当我拿到电脑时,我将不得不看看这个。它可能与您的块选项有关。目前,您的代码返回控制台输出,datatable 可能需要一些帮助才能正确呈现
  • 非常有趣。这个问题可以进一步概括:为什么带有隐式打印DT::datatable(iris)asis 块可以工作,而print(DT::datatable(iris)) 却不行? (请注意,如果将cat 放在DT::datatable(iris) 之前,则问题中的代码有效,因为if 返回它的最后一条语句,导致隐式打印数据表。)
  • 我不认为它仅限于“asis”。对我来说,猫是在数据表之前还是之后都没有关系......另外,如果我只是附加“i = 1”,也没有任何变化,即猫仍然可以工作但数据表没有

标签: r datatable knitr r-markdown


【解决方案1】:

这与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()

}

【讨论】:

  • 现在我很好奇 - 你介意添加一个简短的解释(或参考)为什么会发生这种情况吗?
  • 感谢您详细说明这一点。我还在消化你的回答……
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2021-10-19
相关资源
最近更新 更多