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.text
是TRUE
.
小智 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)
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)
上面接受的答案非常适合内联内容。
对于块内容(Markdown 文本的几个段落之一),knitr包含一个asis
引擎,允许有条件地包含 Markdown 内容,具体取决于块选项echo = FALSE
或echo = 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
归档时间: |
|
查看次数: |
15775 次 |
最近记录: |