Conditionally display block of markdown text using knitr

前端 未结 2 1354
野的像风
野的像风 2020-12-13 21:22

I would like to edit a single rmarkdown (Rmd) document with a list of \"problems\", each followed by its solution. Each solution may contain the results of R console, but al

相关标签:
2条回答
  • 2020-12-13 22:01

    You could use the asis engine to conditionally include/exclude arbitrary text in knitr, e.g.

    ```{asis, echo=FALSE}
    Some arbitrary text.
    
    1. item
    2. item
    
    Change echo=TRUE or FALSE to display/hide this chunk.
    ```
    

    But I just discovered a bug in this engine and fixed it. Unless you use knitr >= 1.11.6, you can create a simple asis engine by yourself, e.g.

    ```{r setup, include=FALSE}
    library(knitr)
    knit_engines$set(asis = function(options) {
      if (options$echo && options$eval) paste(options$code, collapse = '\n')
    })
    ```
    

    If you want to include inline R expressions in the text, you will have to knit the text, e.g.

    ```{r setup, include=FALSE}
    library(knitr)
    knit_engines$set(asis = function(options) {
      if (options$echo && options$eval) knit_child(text = options$code)
    })
    ```
    
    0 讨论(0)
  • 2020-12-13 22:09

    There is a way to hide parts of the document (including text and chunks): to comment them out with html comment marks.

    And comment marks can be generated by R in a block according to a variable that can be set at the beginning of the document.

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

    And just to show a complete working example, in the example below the middle section of the document can be shown or hidden by setting the hide variable to FALSE or TRUE. That might be useful in case there are several sections to hide or show at once - for example, solutions of course problems.

    ---
    title: "Untitled"
    date: "15/10/2020"
    output:
      word_document: default
      html_document: default
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    hide <- TRUE #TRUE to comment out part of the document, FALSE to show.
    ```
    
    ## Start
    
    Always shown.
    
    ```{r}
    hide
    ```
    
    ```{r results='asis', echo=FALSE}
    if (hide) {cat("<!---")}
    ```
    
    ## To hide or not to hide
    
    To be hidden or shown according to *hide* variable.
    
    ```{r}
    "Also to be hidden according to 'hide' variable"
    hist(rnorm(10))
    ```
    
    ```{r results='asis', echo=FALSE}
    if (hide) {cat("-->")}
    ```
    
    <!--
    Never shown.
    -->
    
    ## End
    
    Always shown.
    
    0 讨论(0)
提交回复
热议问题