代码之家  ›  专栏  ›  技术社区  ›  andrew

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

  •  49
  • andrew  · 技术社区  · 11 年前

    我正在使用knitter解析一个R Markdown文档。有没有一种方法可以根据我传递给knitter的环境中的变量在R Markdown中有条件地显示一块文本?

    例如,类似于:

    `r if(show.text) {`
      la la la
    `r }`
    

    如果 show.text 是真的。

    8 回复  |  直到 11 年前
        1
  •  72
  •   Greg Snow    11 年前

    您需要一个完整的R表达式,因此不能像您显示的那样将其拆分为多个块,但如果块的结果是文本字符串,则它将按原样包含(不带引号),因此您应该能够执行以下操作:

    `r if(show.text){"la la la"}`
    

    如果且仅当 show.text TRUE .

        2
  •  38
  •   CL.    9 年前

    您可以使用“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")
    ```
    

    我一直在使用 YAML 配置文件来参数化我的markdown报告,这使它们更可重用。

    ```{r load_config}
    library(yaml)
    config <- yaml.load_file("config.yaml")
    ```
    

    ...

    ```{r conditional_print, eval=config$show_text}
    print("la la la")
    ````
    
        3
  •  36
  •   jkeirstead    9 年前

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

    ```{r conditional_print, child='text.Rmd', eval = show_text}
    ```
    

    这样做的优点是,您仍然可以将内联R语句或其他块放入子文件中,这样,如果您改变了对可选文本的看法,就不必重构项目。

        4
  •  28
  •   David Marx    8 年前

    这里对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...")
    ```
    

    更好的是,如果我们调用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"
    """)
    ```
    
        5
  •  6
  •   Milan ValáÅ¡ek    8 年前

    上面的解决方案对于较大的文本块可能有点笨拙,而对于某些情况则不太好。假设我想为学生创建一个有一些问题的工作表,并使用相同的.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')`
    

    然后我可以做到:

    What is $2 + 2$
    
    \ifsol
    4
    \fi
    

    这样,您还可以使用

    \ifsol
    Alternative 1
    \else
    Alternative 2
    \fi
    
        6
  •  4
  •   cderv    5 年前

    以上公认的答案适用于内联内容。

    对于块内容(Markdown文本的几个段落之一), 针织工 包含 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!
    ```
    

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

        7
  •  3
  •   Jacek    6 年前

    另一种有条件地添加markdown文本的方法如下。它使用 block “引擎”似乎运行良好,尽管我不确定如何使内联R评估工作。

    注意,我使用 view_all 在YAML元数据中定义的开关,以控制块是否可见。

    此外,请注意 eval include 需要块选项。 第一种方法可防止常规操作过程中的错误 Run All 在RStudio。 第二个防止Knit输出。

    ---
    title: "Conditional Output"
    params:
      view_all: false
    output:
      html_document: default
      pdf_document: default
    ---
    
    ```{block eval=FALSE, include=params$view_all}
    # Some simple markdown.
    
    Some things work: $2 + 2^2 = 3\cdot2$
    
    Other does not: 2 + 2 = `r 2+2`
    ```
    
        8
  •  1
  •   Tommi Härkänen    7 年前

    我试图定义一个函数 my.render() ,对Rmd文件进行预处理,具体取决于 commentout 参数,保留HTML注释代码( TRUE )或删除它们( FALSE ). 然后将预处理的Rmd文件写入 tmp.Rmd ,并使用通常的 render() 作用

    my.render <- function(input, commentout=FALSE, ...) {
      if (commentout == FALSE) {
        ## Delete the HTML comment lines from code
        txt <- readLines(input)
        txt[grepl(" *<!-- *| *--> *", txt)] <- ""
        write.table(txt, file="tmp.Rmd", sep="\n", quote=FALSE, row.names=FALSE, col.names=FALSE)
        render("tmp.Rmd", output_file=sub("Rmd","html",input), ...)
      } else {
        render(input, output_file=sub("Rmd","html",input), ...)
      }
    }
    

    这似乎奏效了。例如。

    <!--
    This text with formulas $\alpha+\beta$ is visible, when commentout=FALSE.
    -->