如何在knitr中根据条件包含标题

7

我在一个Rmd文件中有一个标题,后面跟着一段代码块。如果满足条件,我只想包括这个标题和它后面的代码块。我知道如何处理代码块,因为它在代码主体中,但是如何处理前面的标题呢?

```{r}
 print_option <- TRUE
```

## My header
```{r}
 if(print_option==TRUE) {
 print (x)
 }
```
2个回答

14

chunk optionevalasis_output() 提供了简单的解决方案。

假设 print_option 是一个布尔值,指示是否显示头部(以及是否在块 example1 中执行其他代码,如 print(1:10)):

```{r setup}
library(knitr)
print_option <- TRUE
```

```{r, eval = print_option}
asis_output("## My header\\n") # Header that is only shown if print_option == TRUE
print(1:10) # Other stuff that is only executed if print_option == TRUE
```

Text that is shown regardless of `print_option`.

```{r setup2}
print_option <- FALSE
```

Now `print_option` is `FALSE`. Thus, the second header is not shown.

```{r, eval = print_option}
asis_out("## Second header\\n")
```

输出:

Output

对于更长的条件性输出(文本/标记语言,没有嵌入式 R 代码),引擎 asis 可以很有帮助,参见 这个答案(它很长,但最后的解决方案非常简洁)。

补充说明

为什么像这个答案所建议的那样使用## `r 标题`,其中标题设置为"My header""" 是一种不好的方法?因为在第二种情况下它会创建一个"空标题"。这个标题在呈现的 HTML/markdown 输出中是不可见的,但它仍然存在。请看下面的示例:

```{r, echo = FALSE}
title <- ""
```

## `r title`

这将生成以下标记...

## 
...和HTML:

<h2></h2>

除了语义上毫无意义外,它可能会导致布局问题(取决于样式表),并破坏文档大纲。


谢谢@CL。 你的解决方案唯一的问题是它会将代码输出的其余部分打印成块状文本。 - asiehh
@Asieh,我想你是指链接的答案,对吗?还是这里的“cat”解决方案有什么问题吗? - CL.
不,我指的是你的答案,尽管链接的解决方案给出了相同的输出。这与代码块中输出代码的格式不同于正常输出格式有关。我只想选择包含标题或不包含标题的选项,我不想更改代码的输出格式。 - asiehh
@Asieh 感谢您的反馈。我目前正在手机上写作,但稍后回到笔记本电脑时我会再次查看这个问题... - CL.
@AsiehHarati 更新了答案。如果您指的是来自print(1:10)的输出格式,那么现在已经修复了。如果我误解了问题,请告诉我。 - CL.

0

我想通了 :)

    ```{r, echo=FALSE,  include=FALSE}
    x<- FALSE
    if ( x ) {
      Title <- "My header"
    } else {Title=""}
    ```
    ## `r Title` 
    ```{r, echo=FALSE}
    if(x) {
    print(1:10)
    }
    ```

这不是一个好主意;如果 x 不为 TRUE,它会留下一个“空标题” ## - CL.
不,它并不会。## 只是用于字体大小。如果它前面没有任何内容,它将为空白。 - asiehh
是的。请参阅下面我的回答补充说明。 - CL.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接