'imprimir' widgets HTML no Rmarkdown gerado programaticamente

Oct 19 2020

Estou tentando gerar programaticamente alguns Rmarkdown e uma das seções contém um widget HTML. Eles são reproduzidos corretamente se forem os últimos em minha função. No entanto, se eu envolvê-los em um printpara poder colocar outra coisa depois deles, como você faria para um gráfico, eles não produzem nenhuma saída.

Talvez tenha algo a ver com a maneira como knitrlida com a impressão, não tenho certeza. Mas alguém sabe como posso fazer com que os widgets HTML se comportem como os gráficos no Rmarkdown gerado programaticamente?

Exemplo .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()
```

Respostas

1 Waldi Oct 19 2020 at 18:12

A questão foi discutida aqui .

Adicionar as dependências manualmente é feito com:

data.frame() %>%
  DT::datatable() %>%
  knitr::knit_print() %>%
  attr('knit_meta') %>%
  knitr::knit_meta_add() %>%
  invisible()

No exemplo que você forneceu:

---
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()
```