'asis' MarkdownchunckでJSレンダラーを初期化するための推奨される方法
'asis'チャンクは、Markdownドキュメント内のオブジェクトのリストを出力するのに非常に便利です。次の例を参照してください。 https://stackoverflow.com/a/63437006/13513328、 https://stackoverflow.com/a/63533888/13513328、 https://stackoverflow.com/a/63495651/13513328、..。
ただし、上記の例では、レンダラーが前のチャンクで一度も呼び出されていない場合、オブジェクトのリストは印刷されないため、初期化されます。これはトリッキーな回避策であり、試行によって解決策がさらに見つかりました。ドキュメントで見つけるよりもエラー。
これは再現可能な問題であり、 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() })
```
回答
本当に必要な場合は'asis'
、JavaScriptやCSSなどの依存関係を手動で追加します。あなたはでそれを行うことができます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)))})
```
なしで複数のデータテーブルを出力できますasis
。ウィジェットのリストをに入れるだけですtagList()
```{r}
library(purrr)
list("cars" = mtcars, "flowers" = iris) %>%
map(~DT::datatable(.x)) %>%
htmltools::tagList()
```
私の質問への答えは@cdervによって与えられました:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674
結果= 'asis'は、より詳細に文書化されています。 https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis。これは、Rチャンクから生のマーダウンコンテンツを生成することを目的としています。何かがテキスト出力になる必要があります。暗黙的に、コンテンツをknit_printingするときにknitrは調整を行わないため、これらのチャンク内のRオブジェクトに対してknitrマジックは実際には発生しません(テキストが突き出ているため)。
htmlwidgetのような複雑なRオブジェクトをcat()するためにresult = 'asis'を使用しないと思います。回避策を見つけましたが、他の問題が発生する可能性があります。
この回答は@yihuiに好まれているため、cat + asis
onhtmlwidget
は自己責任で使用する必要があることを示唆しています。
ただし、それが機能する限り、非常に実用的であると思うので、私は個人的に質問で言及された回避策を使用し続けます。
貴重な情報を提供してくれた@atusiと@cdervに感謝します。