Pab*_*ori 13 markdown r conditional-compilation knitr r-markdown
我想编辑一个带有"问题"列表的rmarkdown(Rmd)文档,每个文档后面跟着它的解决方案.每个解决方案可能包含R控制台的结果,但也有一些解释(markdown和LaTeX格式化)文本.此外,我想在两个版本中编写它:使用和不使用解决方案,尽可能少地更改源代码并进行编译.
我知道我可以使用逻辑变量来有条件地评估R代码并显示图和R输出,但我不知道如何显示/隐藏(markdown和LaTeX)格式化文本的块,除非我将所有文本放入R字符向量,这似乎很难保持清洁和可读性.
我找到了老问题
解决方案是为简单的短文本提供的,它包含在R print()函数的参数中.
这是另一个老问题
有一个父亲文件和儿童文件有条件编译,但我不想把我的文件分成这么多块.
Yih*_*Xie 19
您可以使用asis引擎有条件地在knitr中包含/排除任意文本,例如
```{asis, echo=FALSE}
Some arbitrary text.
1. item
2. item
Change echo=TRUE or FALSE to display/hide this chunk.
```
Run Code Online (Sandbox Code Playgroud)
但我刚刚在这个引擎中发现了一个错误并修复了它.除非你使用knitr > = 1.11.6,否则你可以asis自己创建一个简单的引擎,例如
```{r setup, include=FALSE}
library(knitr)
knit_engines$set(asis = function(options) {
if (options$echo && options$eval) paste(options$code, collapse = '\n')
})
```
Run Code Online (Sandbox Code Playgroud)
如果要在文本中包含内联R表达式,则必须编织文本,例如
```{r setup, include=FALSE}
library(knitr)
knit_engines$set(asis = function(options) {
if (options$echo && options$eval) knit_child(text = options$code)
})
```
Run Code Online (Sandbox Code Playgroud)
有一种方法可以隐藏文档的某些部分(包括文本和块):使用 html 注释标记将其注释掉。
R可以根据在文档开头设置的变量在块中生成注释标记。
```{r results='asis', echo=FALSE}
if (hide) {cat("<!---")}
```
```{r results='asis', echo=FALSE}
if (hide) {cat("-->")}
```
Run Code Online (Sandbox Code Playgroud)
为了展示一个完整的工作示例,在下面的示例中,可以通过将hide变量设置为 FALSE 或 TRUE 来显示或隐藏文档的中间部分。如果需要同时隐藏或显示多个部分,例如课程问题的解决方案,这可能会很有用。
---
title: "Untitled"
date: "15/10/2020"
output:
word_document: default
html_document: default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
hide <- TRUE #TRUE to comment out part of the document, FALSE to show.
```
## Start
Always shown.
```{r}
hide
```
```{r results='asis', echo=FALSE}
if (hide) {cat("<!---")}
```
## To hide or not to hide
To be hidden or shown according to *hide* variable.
```{r}
"Also to be hidden according to 'hide' variable"
hist(rnorm(10))
```
```{r results='asis', echo=FALSE}
if (hide) {cat("-->")}
```
<!--
Never shown.
-->
## End
Always shown.
Run Code Online (Sandbox Code Playgroud)
需要注意的是:在 html 输出中,隐藏部分保留为注释,只需查看源代码即可看到。另一方面,PDF (LaTex) 和 Word 输出忽略 html 注释,并且隐藏部分不包含在编织文档中。
因此,当隐藏部分需要保密时(例如考试答案),应使用 PDF 或 Word 输出而不是 html。