'asis' MarkdownchunckでJSレンダラーを初期化するための推奨される方法

Aug 22 2020

'asis'チャンクは、Markdownドキュメント内のオブジェクトのリストを出力するのに非常に便利です。次の例を参照してください。 https://stackoverflow.com/a/63437006/13513328https://stackoverflow.com/a/63533888/13513328https://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() })

```
 

  

回答

3 atusy Aug 24 2020 at 15:47

本当に必要な場合は'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)))})
```
2 atusy Aug 24 2020 at 08:27

なしで複数のデータテーブルを出力できますasis。ウィジェットのリストをに入れるだけですtagList()

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

私の質問への答えは@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 + asisonhtmlwidgetは自己責任で使用する必要があることを示唆しています。

ただし、それが機能する限り、非常に実用的であると思うので、私は個人的に質問で言及された回避策を使用し続けます。

貴重な情報を提供してくれた@atusiと@cdervに感謝します。