为什么Rmarkdown中嵌入部分代码块输出无需设置results="asis"?
核心判断逻辑
knitr并非自动识别输出内容是否为原生markdown,而是通过两套不同的输出处理逻辑做区分:
- 默认
results="markup"模式下,代码块的输出分两类走不同处理流程:- R对象打印输出:knitr会优先调用
knit_print()泛型函数处理要打印的R对象,而非直接使用R默认的控制台打印逻辑。像knitr::kable()返回的对象自带knitr_kable类,对应的knit_print.knitr_kable方法会直接调用knitr::asis_output()把生成的表格内容标记为原生markdown,直接插入文档,不会加控制台输出的##前缀。 - 标准输出流(stdout)内容:通过
writeLines()、cat()这类函数直接写入标准输出流的内容,在默认模式下都会被识别为控制台交互输出,统一加上注释前缀、按代码样式格式化。
- R对象打印输出:knitr会优先调用
results="asis"模式的作用是关闭上述stdout内容的格式化逻辑,所有写入stdout的内容会直接原样插入文档,所以你手动拼接的markdown字符串用writeLines()输出时需要开启这个选项。
补充技巧
如果不想每次手动设置results="asis",可以给你生成的原生markdown内容套一层knitr::asis_output(),直接打印就能正常输出:
```{r}`r ''` table <- "|col1|col2|\n|-|-|\n|a|b|" knitr::asis_output(table)
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

