使用knitr有条件地显示Markdown文本块

问题描述 投票:0回答:3

我想编辑一个包含“问题”列表的 rmarkdown (Rmd) 文档,每个问题后面都有其解决方案。每个解决方案可能包含 R 控制台的结果,但也包含一些解释(markdown 和 LaTeX 格式)文本。此外,我想在 2 个版本中使用

knitr
:有解决方案和没有解决方案,尽可能少地更改源代码,然后编译。

我知道我可以使用逻辑变量来有条件地评估 R 代码并显示绘图和 R 输出,但我不知道如何显示/隐藏(markdown 和 LaTeX)格式文本块,除非我把所有这些将文本转换为 R 字符向量,这似乎很难保持内容整洁和可读。

我发现了这个老问题,

有条件地在 R Markdown 中显示文本块

其中给出了简单短文本的解决方案,该解决方案作为 R

print()
函数的参数包含在内。

另一个老问题,

使用 knitr 将 Markdown 文档的部分内容插入到另一个 Markdown 文档中

是为了拥有一个有条件编译的父文档和子文档,但我不想将我的文档分成这么多部分。

r markdown knitr r-markdown conditional-compilation
3个回答
31
投票

您可以使用

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)
})
```

5
投票

有一种方法可以隐藏文档的部分内容(包括文本和块):使用 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。


0
投票

对于那些通过 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("}")}
```
© www.soinside.com 2019 - 2024. All rights reserved.