为啥我不需要 results = "asis" 在 Rmarkdown 中逐字嵌入块输出?

Posted

技术标签:

【中文标题】为啥我不需要 results = "asis" 在 Rmarkdown 中逐字嵌入块输出?【英文标题】:Why do I not need results = "asis" to embed chunk output verbatim in Rmarkdown?为什么我不需要 results = "asis" 在 Rmarkdown 中逐字嵌入块输出? 【发布时间】:2021-12-20 14:05:24 【问题描述】:

我曾经认为需要results = "asis" 块选项才能在渲染的 Rmarkdown 文档中逐字包含任何块输出;否则输出将被格式化为控制台输出(例如带有前导 ##)。

但是,即使没有 results = "asis" 选项,knitr::kable() 等几个函数似乎也能正常工作,而我手动创建的表在下面的示例中被格式化为控制台输出。

knitr 是如何知道输出是逐字降价并且应该这样嵌入的?

我的例子:

---
title: Title
output: github_document
---

```r
# works without results = "asis"
knitr::kable(mtcars)
```

```r
# without results = "asis": formatted as console output
table <- "|col1|col2|\n|-|-|\n|a|b|"
writeLines(table)
```

```r, results='asis'
# works only with results = "asis"
writeLines(table)
```

【问题讨论】:

【参考方案1】:

results = 'asis' 告诉knitr不要将代码块输出包装在代码块中。

在您的示例 2 中,输出被格式化为代码块(因为没有 results = 'asis'):

## |col1|col2|
## |-|-|
## |a|b|

示例 3 按“原样”处理输出,这是格式化表格的有效降价。

R Markdown Cookbook 中给出了一些附加示例。

【讨论】:

但是为什么即使没有results = "asis",它也能在第一个示例中工作?示例 2 和 3 代表了我认为这个块选项的工作原理。 那是因为pandoc正确识别通过kable生成的管道表(这是默认的kable输出格式)。请注意,这仅在 kable 是代码块中的***表达式时才有效。 Stack Overflow 和 GH 上有很多围绕这个“特性”的帖子,这通常导致需要在表达式中包含 result = 'asis',包括嵌套的 kable 调用或循环:参见例如here, here. 然后我很想看看knitr 输出什么(即在pandoc 将markdown 风格转换为GitHub 之前)......显然在导出为@987654339 时没有keep_md 选项@.

以上是关于为啥我不需要 results = "asis" 在 Rmarkdown 中逐字嵌入块输出?的主要内容,如果未能解决你的问题,请参考以下文章

请问,as.Date(),as.POSIXct()函数都识别不了月份的英文,是为啥呀?

为啥没有使用关键字“AS”设置列别名?

为啥铸造给CS0030,而“as”有效?

为啥我不能使用 BabelJS 使用“import ... as”导入默认导出

AS3:为啥“this”在函数内部会改变它所指的内容?

多处理返回“打开的文件太多”,但使用 `with...as` 修复它。为啥?