繁体   English   中英

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

[英]Conditionally display block of markdown text using knitr

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

我知道我可以使用逻辑变量来有条件地评估 R 代码并显示图和 R output,但我不知道如何显示/隐藏(markdown 和 LaTeX)格式化文本块,除非我把所有的文本进入 R 个字符向量,这似乎很难保持事物的清洁和可读性。

我发现了这个老问题,

有条件地显示一段文本 R Markdown

其中针对简单的短文本给出了解决方案,它作为 R print() function 的参数包含在内。

这个另一个老问题,

使用 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.
```

但我刚刚在这个引擎中发现了一个错误并修复了它 除非你使用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)
})
```

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

对于那些在编织到 pdf 到 LaTex 时寻找解决方案的人,@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("}")}
```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM