设置knitr代码块选项时,如何检测代码块语言适配R/Python版本书籍?
实现Quarto书籍按版本自动切换代码块显示与执行
完全可以通过knitr的动态选项设置实现你的需求,核心思路是利用knitr在处理每个代码块时能获取当前代码块的语言引擎,结合版本标识判断是否执行/显示该代码块。
具体实现代码
在文档开头的setup代码块中,按以下方式设置:
```{r, setup, include=FALSE} # 假设已通过其他逻辑确定当前版本(比如命令行参数、环境变量等) is_py_ed <- TRUE # Python版本设为TRUE,R版本设为FALSE is_r_ed <- !is_py_ed # 定义复用的判断函数 should_include <- function() { # 获取当前代码块的语言引擎 current_engine <- knitr::opts_current$get("engine") # 根据版本和引擎判断是否显示/执行 (current_engine == "python" && is_py_ed) || (current_engine == "r" && is_r_ed) } # 全局设置代码块的eval和echo选项 knitr::opts_chunk$set( eval = should_include, echo = should_include )
### 效果说明 - 当构建**Python版本**时(`is_py_ed = TRUE`):所有`python`代码块会正常执行并显示,`r`代码块会被隐藏且不执行(等价于设置`eval=FALSE, echo=FALSE`)。 - 当构建**R版本**时(`is_py_ed = FALSE`):所有`r`代码块正常执行并显示,`python`代码块被隐藏且不执行。 ### 关键原理 knitr允许将代码块选项(如`eval`、`echo`)设为函数,这些函数会在处理每个代码块时被调用。通过`knitr::opts_current$get("engine")`可以获取当前代码块的语言类型(`r`或`python`),再结合版本标识就能动态控制代码块的行为。 内容的提问来源于stack exchange,提问作者Matthew Brett
相关产品推荐
相关产品推荐

