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

and*_*rew 25 r knitr r-markdown

我正在使用knitr来解析R Markdown文档.是否有办法根据我传入knitr的环境中的变量有条件地显示R Markdown中的文本块?

例如,类似于:

`r if(show.text) {`
  la la la
`r }`
Run Code Online (Sandbox Code Playgroud)

如果show.text是真的,将在生成的文档中打印"la la la" .

Gre*_*now 41

你需要一个完整的R表达式,所以你不能像你展示的那样把它分成多个块,但是如果一个块的结果是一个文本字符串,那么它将按原样包含(没有引号),所以你应该能够做一些事情喜欢:

`r if(show.text){"la la la"}`
Run Code Online (Sandbox Code Playgroud)

它将包括文本,当且仅当show.textTRUE.

  • 这太棒了,应该被接受.甚至扩展到更复杂的降价输入,例如`\`r if(TRUE){"#Header \n这是在标题下\n \n ## subheader \n这个下层?"} \`` (7认同)

小智 23

您可以使用"eval"块选项执行此操作.见http://yihui.name/knitr/options/.

```{r setup, echo=FALSE}
show_text <- FALSE
````

```{r conditional_block, eval=show_text}
print("this will only print when show.text is TRUE")
```
Run Code Online (Sandbox Code Playgroud)

我一直在使用YAML配置文件来参数化我的降价报告,这使它们更具可重用性.

```{r load_config}
library(yaml)
config <- yaml.load_file("config.yaml")
```
Run Code Online (Sandbox Code Playgroud)

...

```{r conditional_print, eval=config$show_text}
print("la la la")
````
Run Code Online (Sandbox Code Playgroud)

  • 请注意,与[Greg Snow的答案](http://stackoverflow.com/a/25407811/2706569)相对,此解决方案将打印带有“输出标记”的文本,而不是逐字显示。 (2认同)
  • 这是因为缺少 `results = 'asis'`。“asis”knitr 引擎更适合此任务:/sf/answers/4651801031/ (2认同)

jke*_*ead 17

通过将所有文本放入单独的文件中然后将其包含在主文件中,我发现最简单的方法是:

```{r conditional_print, child='text.Rmd', eval = show_text}
```
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您仍然可以将内联R语句或其他块放入子文件中,这样,如果您改变主意关于什么算作可选文本,则无需重构项目.


Dav*_*arx 14

这是对Paul Boardman的方法的一个调整,它在输出中给出了适当的标记.

```{r setup, echo=FALSE}
show_text <- FALSE
```

```{r conditional_block, echo=FALSE, results='asis', eval=show_text}
cat("## Hey look, a heading!

lorem ipsum dolor emet...")
```
Run Code Online (Sandbox Code Playgroud)

更好的是,如果我们调用python引擎来生成输出,我们可以使用三重引用来轻松处理包含单引号或双引号的文本,而无需做任何花哨的事情:

```{python, conditional_block_py, echo=FALSE, results='asis', eval=show_cond_text}
print("""
## Still a heading

Block of text with 'single quotes' and "double quotes"
""")
```
Run Code Online (Sandbox Code Playgroud)


小智 6

对于较大的文本块,上述解决方案可能有点笨拙,而对于某些情况则不是很好。假设我想为有一些问题的学生创建一个工作表,并使用相同的 .Rmd 文件生成一个包含解决方案的文件。我使用了基本的 LaTeX 流量控制:

``` {r, include = F}
# this can be e.g., in a parent .Rmd and the below can be in child
solution <- TRUE 
```
\newif\ifsol
\sol`r ifelse(solution, 'true', 'false')`
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

What is $2 + 2$

\ifsol
4
\fi
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您还可以使用创建替代文本块

\ifsol
Alternative 1
\else
Alternative 2
\fi
Run Code Online (Sandbox Code Playgroud)


cde*_*erv 6

上面接受的答案非常适合内联内容。

对于块内容(Markdown 文本的几个段落之一),knitr包含一个asis引擎,允许有条件地包含 Markdown 内容,具体取决于块选项echo = FALSEecho = TRUE

文档中的示例https://bookdown.org/yihui/rmarkdown-cookbook/eng-asis.html

```{r}
getRandomNumber <- function() {
  sample(1:6, 1)
}
```

```{asis, echo = getRandomNumber() == 4}
According to https://xkcd.com/221/, we just generated
a **true** random number!
```
Run Code Online (Sandbox Code Playgroud)

如果您需要包含更复杂的内容,例如带有代码块的 R Markdown 文档的一部分,那么子文档可能会很有用。参见https://bookdown.org/yihui/rmarkdown-cookbook/child-document.html