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

时间:2015-10-05 09:00:39

标签: r markdown knitr r-markdown conditional-compilation

我想编辑一个带有“问题”列表的rmarkdown(Rmd)文档,每个文档后面跟着它的解决方案。每个解决方案可能包含R控制台的结果,但也有一些解释(markdown和LaTeX格式化)文本。此外,我想在两个版本中编写它:使用和不使用解决方案,尽可能少地更改源代码并进行编译。

我知道我可以使用逻辑变量来有条件地评估R代码并显示图和R输出,但我不知道如何显示/隐藏(markdown和LaTeX)格式化文本的块,除非我全部放入将文本转换为R字符向量,这似乎很难保持清晰和可读。

我找到了老问题

Conditionally display a block of text in R Markdown

为简单的短文本提供了解决方案,该文本作为R print()函数的参数包含在内。

这是另一个老问题

insert portions of a markdown document inside another markdown document using knitr

是因为有父文件和有条件编译的子文件,但我不想把我的文件分成很多部分。

2 个答案:

答案 0 :(得分:17)

您可以使用asis引擎有条件地在 knitr 中包含/排除任意文字,例如

```{asis, echo=FALSE}
Some arbitrary text.

1. item
2. item

Change echo=TRUE or FALSE to display/hide this chunk.
```

但我刚刚在这个引擎中发现了一个错误fixed it。除非你使用 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')
})
```

如果要在文本中包含内联R表达式,则必须编织文本,例如

```{r setup, include=FALSE}
library(knitr)
knit_engines$set(asis = function(options) {
  if (options$echo && options$eval) knit_child(text = options$code)
})
```

答案 1 :(得分:1)

有一种隐藏文档部分(包括文本和大块)的方法:用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.