在 'asis' R Markdown 块中初始化 JS 渲染器的推荐方法
Recommended way to initialize JS renderer in 'asis' R Markdown chunk
'asis' 块对于在 Markdown 文档中输出对象列表非常有用,请参见以下示例:, , , ...
但是,在上面的示例中,如果渲染器在之前的块中未被调用一次,则对象列表将不会打印,因此它会被初始化:这是一个棘手的解决方法,与在文档中找到解决方案相比,我更多地是通过试验/错误找到解决方案。
这是一个可重现的问题,也发布在 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
即可输出多个数据表。
只需将小部件列表放入 tagList()
```{r}
library(purrr)
list("cars" = mtcars, "flowers" = iris) %>%
map(~DT::datatable(.x)) %>%
htmltools::tagList()
```
如果您确实需要 '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)))})
```
@cderv 已经回答了我的问题:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674
The results = 'asis' is now more documented in https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis . It is aimed at generating raw mardown content from a R chunk. Anything must result in a text output, and implicitly that means no knitr magic really happens for any R object in those chunk, because knitr does no adjustment when knit_printing the content (as it is juts text)
I think I would not use result = 'asis' to cat() a complex R object like an htmlwidget. You found a workaround but you may encounter other issues.
由于这个回答被@yihui点赞了,所以提示htmlwidget
上的cat + asis
使用风险自负
但是,我个人会继续使用问题中提到的解决方法,因为只要它有效,我觉得它非常实用。
感谢@atusi 和@cderv 的宝贵意见。
'asis' 块对于在 Markdown 文档中输出对象列表非常有用,请参见以下示例:
但是,在上面的示例中,如果渲染器在之前的块中未被调用一次,则对象列表将不会打印,因此它会被初始化:这是一个棘手的解决方法,与在文档中找到解决方案相比,我更多地是通过试验/错误找到解决方案。
这是一个可重现的问题,也发布在 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
即可输出多个数据表。
只需将小部件列表放入 tagList()
```{r}
library(purrr)
list("cars" = mtcars, "flowers" = iris) %>%
map(~DT::datatable(.x)) %>%
htmltools::tagList()
```
如果您确实需要 '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)))})
```
@cderv 已经回答了我的问题:
https://github.com/rstudio/rmarkdown/issues/1877#issuecomment-679864674
The results = 'asis' is now more documented in https://bookdown.org/yihui/rmarkdown-cookbook/results-asis.html#results-asis . It is aimed at generating raw mardown content from a R chunk. Anything must result in a text output, and implicitly that means no knitr magic really happens for any R object in those chunk, because knitr does no adjustment when knit_printing the content (as it is juts text)
I think I would not use result = 'asis' to cat() a complex R object like an htmlwidget. You found a workaround but you may encounter other issues.
由于这个回答被@yihui点赞了,所以提示htmlwidget
上的cat + asis
使用风险自负
但是,我个人会继续使用问题中提到的解决方法,因为只要它有效,我觉得它非常实用。
感谢@atusi 和@cderv 的宝贵意见。