Méthode recommandée pour initialiser le moteur de rendu JS dans le chunck Markdown 'asis'
Les chuncks 'asis' sont très utiles pour afficher une liste d'objets dans un document Markdown, voir les exemples suivants: https://stackoverflow.com/a/63437006/13513328, https://stackoverflow.com/a/63533888/13513328, https://stackoverflow.com/a/63495651/13513328, ...
Cependant, dans les exemples ci-dessus, la liste des objets ne s'imprimera pas si le moteur de rendu n'a pas été appelé une fois dans un chunck précédent , de sorte qu'il soit initialisé: c'est une solution de contournement délicate, et j'ai trouvé la solution plus par essai / erreur qu'en la trouvant dans la documentation.
Il s'agit d'un numéro reproductible également publié sur 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() })
```
Réponses
Si vous en avez vraiment besoin 'asis', vous ajoutez manuellement des dépendances supplémentaires telles que JavaScript et CSS. Vous pouvez le faire avec 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)))})
```
Vous pouvez générer plusieurs tables de données sans asis. Mettez simplement la liste des widgets danstagList()
```{r}
library(purrr)
list("cars" = mtcars, "flowers" = iris) %>%
map(~DT::datatable(.x)) %>%
htmltools::tagList()
```
La réponse à ma question a été donnée par @cderv:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674
Les résultats = 'asis' est maintenant plus documenté dans https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis. Il vise à générer du contenu brut de mardown à partir d'un bloc R. Tout doit aboutir à une sortie de texte, et implicitement cela signifie qu'aucune magie de knitr ne se produit vraiment pour aucun objet R dans ces morceaux, car knitr n'effectue aucun ajustement lors de l'impression du contenu (car c'est du texte en saillie)
Je pense que je n'utiliserais pas result = 'asis' pour cat () un objet R complexe comme un htmlwidget. Vous avez trouvé une solution de contournement, mais vous pouvez rencontrer d'autres problèmes.
Comme cette réponse a été appréciée par @yihui, elle donne un indice selon lequel cat + asison htmlwidgetdevrait être utilisé à ses propres risques.
Cependant, je continuerai personnellement à utiliser les solutions de contournement mentionnées dans la question, car tant que cela fonctionne, je trouve cela très pratique.
Merci @atusi et @cderv pour leur précieuse contribution.