Datatable не печатается в сочетании с командой cat в Rmd / RStudio
Может ли кто-нибудь объяснить, почему в коде Rmd (для создания отчета в формате HTML с использованием RStudio) ниже только 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")
}
```
1 ответ
По сути, это та же проблема, что и knitr # 1137. HTML-виджеты, включая 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()
}