使用 knitr 有条件地显示降价文本块
Conditionally display block of markdown text using knitr
我想编辑一个包含“问题”列表的 rmarkdown (Rmd) 文档,每个问题后面都有其解决方案。每个解决方案可能包含 R 控制台的结果,但也包含一些解释(markdown 和 LaTeX 格式)文本。此外,我想在 2 个版本中使用 knitr
:有和没有解决方案,尽可能少地更改源代码,并编译。
我知道我可以使用逻辑变量来有条件地评估 R 代码并显示绘图和 R 输出,但我不知道如何 show/hide 块(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
是为了有条件编译的父文件和子文件,但我不想把我的文件分成这么多块。
您可以使用 asis
引擎有条件地 include/exclude 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)
})
```
有一种方法可以隐藏部分文档(包括文本和块):用 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.
我想编辑一个包含“问题”列表的 rmarkdown (Rmd) 文档,每个问题后面都有其解决方案。每个解决方案可能包含 R 控制台的结果,但也包含一些解释(markdown 和 LaTeX 格式)文本。此外,我想在 2 个版本中使用 knitr
:有和没有解决方案,尽可能少地更改源代码,并编译。
我知道我可以使用逻辑变量来有条件地评估 R 代码并显示绘图和 R 输出,但我不知道如何 show/hide 块(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
是为了有条件编译的父文件和子文件,但我不想把我的文件分成这么多块。
您可以使用 asis
引擎有条件地 include/exclude 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)
})
```
有一种方法可以隐藏部分文档(包括文本和块):用 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.