问题描述
我正在尝试以编程方式生成一些Rmarkdown,并且其中一部分包含一个HTML小部件。如果它们在我的函数中的最后位置,这些输出就很好。但是,如果我将它们包装在print
中,则可以像在作图时一样在它们之后放置其他内容,它们不会产生任何输出。
我不确定这与knitr
处理打印的方式有关。但是有人知道我如何使HTML小部件的行为像在程序生成的Rmarkdown中的情节一样吗?
示例.Rmd
---
title: "R Notebook"
output:
html_document:
df_print: paged
---
```{r}
ex_plot <- ggplot2::ggplot(iris,ggplot2::aes(Sepal.Length,Sepal.Width)) +
ggplot2::geom_point()
gen_rmarkdown_widget_last <- function() {
cat("# Head 1\n\n")
DT::datatable(iris)
}
gen_rmarkdown_plots <- function() {
cat("# Head 1\n\n")
print(ex_plot)
cat("# Head 2\n\n")
}
gen_rmarkdown_widgets <- function() {
cat("# Head 1\n\n")
print(DT::datatable(iris))
# tried loading from file
# tmp <- tempfile()
# htmlwidgets::saveWidget(DT::datatable(iris),tmp)
# knitr::include_url(tmp)
# tried a different widget
# print(plotly::ggplotly(ex_plot))
cat("# Head 2\n\n")
}
```
```{r,results='asis'}
# works fine
gen_rmarkdown_widget_last()
```
```{r,results='asis'}
# works fine
gen_rmarkdown_plots()
```
```{r,results='asis'}
# Can't have an HTML widget if it is followed by other things
gen_rmarkdown_widgets()
```
解决方法
已经here讨论了该问题。
通过以下方式手动添加依赖项:
data.frame() %>%
DT::datatable() %>%
knitr::knit_print() %>%
attr('knit_meta') %>%
knitr::knit_meta_add() %>%
invisible()
在您提供的示例中:
---
title: "R Notebook"
output:
html_document:
df_print: paged
---
```{r}
library(dplyr)
#load dependencies
data.frame() %>%
DT::datatable() %>%
knitr::knit_print() %>%
attr('knit_meta') %>%
knitr::knit_meta_add() %>%
invisible()
ex_plot <- ggplot2::ggplot(iris,ggplot2::aes(Sepal.Length,Sepal.Width)) +
ggplot2::geom_point()
gen_rmarkdown_widget_last <- function() {
cat("# Head 1\n\n")
DT::datatable(iris)
}
gen_rmarkdown_plots <- function() {
cat("# Head 1\n\n")
print(ex_plot)
cat("# Head 2\n\n")
}
gen_rmarkdown_widgets <- function() {
cat("# Head 1\n\n")
cat(knitr::knit_print(DT::datatable(iris)))
cat("\n \n")
cat("# Head 2\n\n")
}
```
```{r,results='asis'}
gen_rmarkdown_widgets()
```