是否可以仅为特定引擎设置块默认值?

Is it possible to set chunk defaults only for a specific engine?

我在 RMarkdown 文档中使用 SQL 块,我希望 echo 选项对所有块默认为 FALSE – 但仅对 sql块,而不是其他。 我知道我可以设置 knitr::opts_chunk$set(echo = TRUE),但这会为所有块设置它。

, the proper way to do this is to use an option hook。以下为 sql 块设置 echo=FALSE,否则为 echo=TRUE

knitr::opts_hooks$set(echo = function(options) {
  options$echo <- options$engine != "sql"
  return(options)
})

我将在下面留下我的原始答案……以供娱乐。这是一种解决方法,在没有选项挂钩的假设平行宇宙中是必需的。


您可以通过opts_current$get("engine")查询当前引擎。基于此,您可以使用以下函数(并根据需要对其进行扩展)来确定 echo 的所需值:

conditionalDefaut_echo <- function() {
  return(opts_current$get("engine") != "sql")
}

挑战在于在解析新块时评估此函数。这可以通过 quote:

来实现
opts_chunk$set(echo = quote(conditionalDefaut_echo()))

老实说,我不确定这有多可靠——这种 metaprogramming 取决于 knitr 的内部运作,将来可能会崩溃。 (也许一辉要评论这个……)


引擎 rasis 的完整示例,其中 echo 对于 asis 块是 FALSE,否则 TRUE

```{r}
library(knitr)

conditionalDefaut_echo <- function() {
  return(opts_current$get("engine") != "asis")
}

opts_chunk$set(echo = quote(conditionalDefaut_echo()))
```

```{asis}
I'm invisible.
```

```{r}
print(1) # code visible
```