Modo consigliato per inizializzare il renderer JS nel chunck Markdown 'asis'

Aug 22 2020

I blocchi 'asis' sono molto utili per produrre un elenco di oggetti in un documento Markdown, vedere i seguenti esempi: https://stackoverflow.com/a/63437006/13513328, https://stackoverflow.com/a/63533888/13513328, https://stackoverflow.com/a/63495651/13513328, ...

Tuttavia, negli esempi precedenti, l'elenco degli oggetti non verrà stampato se il renderer non è stato chiamato una volta in un blocco precedente , in modo che venga inizializzato: questa è una soluzione alternativa e ho trovato la soluzione più per prova / errore che trovandolo nella documentazione.

Questo è un problema riproducibile pubblicato anche su https://github.com/rstudio/rmarkdown/issues/1877 :

---
title: "Test"
output:
  html_document
---



```{r,echo=F}
library(DT)
library(rmarkdown)
library(purrr)
library(knitr)

df_list <- list("cars" = mtcars, "flowers" = iris)

knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
```

```{r}
# If this first initialization isn't run, tabs won't print
DT::datatable(data.frame())
```

# Test tabs {.tabset}

```{r, results='asis' }
imap(df_list, ~{
  cat('## Subtab ',.y,'\n')
  cat('\n')
  DT::datatable(.x) %>%
    htmltools::tagList() %>% as.character() %>% cat() })

```
 

  

Risposte

3 atusy Aug 24 2020 at 15:47

Se hai davvero bisogno 'asis', aggiungi manualmente dipendenze extra come JavaScript e CSS. Puoi farlo con knitr::knit_meta_add().

```{r, results='asis'}
library(purrr)
data.frame() %>%
  DT::datatable() %>%
  knitr::knit_print() %>%
  attr('knit_meta') %>%
  knitr::knit_meta_add() %>%
  invisible()

df_list <- list("cars" = mtcars, "flowers" = iris)
imap(df_list, ~{
      cat('## Subtab ',.y,'\n')
      cat('\n')
      cat(knitr::knit_print(DT::datatable(.x)))})
```
2 atusy Aug 24 2020 at 08:27

È possibile produrre più dati senza asis. Basta inserire l'elenco dei widget intagList()

```{r}
library(purrr)
list("cars" = mtcars, "flowers" = iris) %>%
  map(~DT::datatable(.x)) %>%
  htmltools::tagList()
```
1 Waldi Aug 29 2020 at 13:57

La risposta alla mia domanda è stata data da @cderv:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674

I risultati = "asis" sono ora più documentati in https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis. Ha lo scopo di generare contenuto mardown grezzo da un blocco R. Qualsiasi cosa deve risultare in un output di testo, e implicitamente questo significa che nessuna magia knitr accade davvero per qualsiasi oggetto R in quei blocchi, perché knitr non fa aggiustamenti quando knit_printing il contenuto (dato che è testo sporgente)

Penso che non userei result = 'asis' per cat () un oggetto R complesso come un htmlwidget. Hai trovato una soluzione alternativa ma potresti riscontrare altri problemi.

Poiché questa risposta è stata apprezzata da @yihui, suggerisce che cat + asison htmlwidgetdovrebbe essere usato a proprio rischio.

Tuttavia, continuerò personalmente a utilizzare le soluzioni alternative menzionate nella domanda, perché finché funziona lo trovo molto pratico.

Grazie @atusi e @cderv per il loro prezioso contributo.