在“asis”R Markdown 块中初始化 JS 渲染器的推荐方法

Wal*_*ldi 7 r knitr r-markdown

'asis' 块对于在 Markdown 文档中输出对象列表非常有用,请参阅以下示例:HighcharterDTLeaflet,...

但是,在上面的示例中,如果渲染器在前一个块中没有被调用一次,则对象列表将不会打印,以便它被初始化:这是一个棘手的解决方法,我通过试验找到了更多解决方案/错误比通过在文档中查找它更容易。

这是一个可重现的问题,也发布在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() })

```
 

  
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您确实需要'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)))})
```
Run Code Online (Sandbox Code Playgroud)


Wal*_*ldi 3

我的问题的答案已由 @cderv 给出:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674

results = 'asis' 现在在https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis中有更多记录。它的目的是从 R 块生成原始 mardown 内容。任何事情都必须产生文本输出,这隐含地意味着这些块中的任何 R 对象都不会真正发生 knitr 魔法,因为 knitr 在 knit_printing 内容时不会进行调整(因为它是突出文本)

我想我不会使用 result = 'asis' 来 cat() 像 htmlwidget 这样的复杂 R 对象。您找到了解决方法,但可能会遇到其他问题。

由于这个答案已被@yihui 点赞,因此它暗示使用cat + asisonhtmlwidget应自行承担风险。

但是,我个人会继续使用问题中提到的解决方法,因为只要它有效,我发现它非常实用。

感谢@atusi 和@cderv 提供的宝贵意见。