【问题标题】:'printing' HTML widgets in programmatically generated Rmarkdown在以编程方式生成的 Rmarkdown 中“打印”HTML 小部件
【发布时间】:2020-10-19 15:22:59
【问题描述】:

我正在尝试以编程方式生成一些 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()
```

【问题讨论】:

  • 试试print(htmltools::tagList(DT::datatable(iris)))。与 stackoverflow.com/questions/63532652/… 相关的外观
  • 有趣的是添加了一个空白区域,小部件将在标题之间移动但不输出小部件...
  • 嗯,很奇怪。我在我的机器上测试了它。当我运行您的代码时,只会打印标题。使用print(htmltools::tagList(DT::datatable(iris))) 在 Head 1 之后输出 DT,然后是 Head 2。
  • 如果我只根据您的建议运行gen_rmarkdown_widgets,那么如果我先运行工作示例gen_rmarkdown_widget_last 然后gen_rmarkdown_widgets 如果可行,则它不起作用。必须与您链接到的帖子中提到的初始化有关
  • 是的。初始化对于在最终的 HTML 文档中包含 JS 依赖项很重要。

标签: r r-markdown knitr htmlwidgets


【解决方案1】:

这个问题已经在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()
```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多