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

lf3rwulv  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(105)

我想编辑一个带有“问题”列表的rmarkdown(Rmd)文档,每个问题后面都有它的解决方案。每个解决方案可能包含R控制台的结果,但也有一些解释性(markdown和LaTeX格式)文本。此外,我想使用2个版本的knitr:使用和不使用解决方案,尽可能少地更改源代码,然后进行编译。
我知道我可以使用逻辑变量来有条件地计算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
我的意思是有一个父文档和一个子文档,它们都是有条件编译的,但是我不想把我的文档分割成这么多块。

ds97pgxw

ds97pgxw1#

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

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

1. item
2. item

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

但是我刚刚发现了这个引擎和[fixed it](https://github.com/yihui/knitr/commit/c38524f4e9a438a971e57fccf79c6be55e7f3158)中的一个bug,除非你使用**knitr**〉= 1.11.6,否则你可以自己创建一个简单的`asis`引擎,例如:
library(knitr)
knit_engines$set(asis = function(options) {
  if (options$echo && options$eval) paste(options$code, collapse = '\n')
})

如果你想在文本中包含内联R表达式,你必须编织文本,例如:
library(knitr)
knit_engines$set(asis = function(options) {
  if (options$echo && options$eval) knit_child(text = options$code)
})
wi3ka0sx

wi3ka0sx2#

有一种方法可以隐藏文档的某些部分(包括文本和块):用HTML注解标记注解掉它们。
并且注解标记可以由R根据可以在文档开头设置的变量在块中生成。

```{r results='asis', echo=FALSE}
if (hide) {cat("<!---")}
if (hide) {cat("-->")}

为了展示一个完整的工作示例,在下面的示例中,可以通过将 *hide* 变量设置为FALSE或TRUE来显示或隐藏文档的中间部分。这在同时隐藏或显示多个部分的情况下可能会很有用-例如,当然是问题的解决方案。

title: "Untitled"
date: "15/10/2020"
output:
word_document: default
html_document: default

knitr::opts_chunk$set(echo = TRUE)
hide <- TRUE #TRUE to comment out part of the document, FALSE to show.

Start

Always shown.

hide
if (hide) {cat("<!---")}

To hide or not to hide

To be hidden or shown according to hide variable.

"Also to be hidden according to 'hide' variable"
hist(rnorm(10))
if (hide) {cat("-->")}

End

Always shown.


只是一个警告:在html输出中,隐藏部分作为注解保存,只需查看源文件即可看到。另一方面,PDF(LaTex)和Word输出忽略html注解,隐藏部分不包含在编织文档中。
因此,当隐藏部分被认为是某种程度上的机密(例如考试解答)时,应使用PDF或Word输出,而不是html。
1wnzp6jl

1wnzp6jl3#

对于那些在通过LaTex编织到pdf时寻找解决方案的人来说,@Pere的答案对你不起作用(因为LaTex不理解<!----->对表示注解)。
以下是一种可能的解决方法:

---
output:
  pdf_document
---

\newcommand{\ignore}[1]{}

```{r echo=FALSE}
include <- TRUE
if(!include){cat("\\ignore{")}

Included bla bla

if(!include){cat("}")}
include <- FALSE
if(!include){cat("\\ignore{")}

NOT Included bla bla

if(!include){cat("}")}

相关问题