我想编辑一个包含“问题”列表的 rmarkdown (Rmd) 文档,每个问题后面都有其解决方案。每个解决方案可能包含 R 控制台的结果,但也包含一些解释(markdown 和 LaTeX 格式)文本。此外,我想在 2 个版本中使用
knitr
:有解决方案和没有解决方案,尽可能少地更改源代码,然后编译。
我知道我可以使用逻辑变量来有条件地评估 R 代码并显示绘图和 R 输出,但我不知道如何显示/隐藏(markdown 和 LaTeX)格式文本块,除非我把所有这些将文本转换为 R 字符向量,这似乎很难保持内容整洁和可读。
我发现了这个老问题,
其中给出了简单短文本的解决方案,该解决方案作为 R
print()
函数的参数包含在内。
另一个老问题,
使用 knitr 将 Markdown 文档的部分内容插入到另一个 Markdown 文档中
是为了拥有一个有条件编译的父文档和子文档,但我不想将我的文档分成这么多部分。
您可以使用
asis
引擎有条件地包含/排除 knitr 中的任意文本,例如
```{asis, echo=FALSE}
Some arbitrary text.
1. item
2. item
Change echo=TRUE or FALSE to display/hide this chunk.
```
如果要在文本中包含内联 R 表达式,则必须编织文本,例如
```{r setup, include=FALSE}
library(knitr)
knit_engines$set(asis = function(options) {
if (options$echo && options$eval) knit_child(text = options$code)
})
```
有一种方法可以隐藏文档的部分内容(包括文本和块):使用 html 注释标记将其注释掉。
R 可以根据在文档开头设置的变量在块中生成注释标记。
```{r results='asis', echo=FALSE}
if (hide) {cat("<!---")}
```
```{r results='asis', echo=FALSE}
if (hide) {cat("-->")}
```
为了展示一个完整的工作示例,在下面的示例中,可以通过将 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.
需要注意的是:在 html 输出中,隐藏部分保留为注释,只需查看源代码即可看到。另一方面,PDF(LaTex)和Word输出忽略html注释,并且隐藏部分不包含在编织文档中。
因此,当隐藏部分需要保密时(例如考试答案),应使用 PDF 或 Word 输出而不是 html。
对于那些通过 LaTex 编织为 pdf 时寻找解决方案的人来说,@Pere 的答案对您不起作用(因为 LaTex 不理解
<!---
-->
对表示注释)。
以下是一种可能的解决方法:
---
output:
pdf_document
---
\newcommand{\ignore}[1]{}
```{r echo=FALSE}
include <- TRUE
```
```{r results='asis', echo=FALSE}
if(!include){cat("\\ignore{")}
```
Included bla bla
```{r results='asis', echo=FALSE}
if(!include){cat("}")}
```
```{r echo=FALSE}
include <- FALSE
```
```{r results='asis', echo=FALSE}
if(!include){cat("\\ignore{")}
```
NOT Included bla bla
```{r results='asis', echo=FALSE}
if(!include){cat("}")}
```