rmarkdownknitrr-markdownconditional-compilation

Conditionally display block of markdown text using knitr


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 the R console, but also some explaining (markdown and LaTeX formatted) text. Besides, I would like use knitr in 2 versions: with and without the solutions, changing the source as less as possible, and compiling.

I know that I can use a logical variable in order to conditionally evaluate R code and show plots and R output, but I don't know how to show/hide blocks of (markdown and LaTeX) formatted text, unless I put all that text into R character vectors, which seems hard for keeping things clean and readable.

I found this old question,

Conditionally display a block of text in R Markdown

where the solution was given for simple short text, which was included as an argument of the R print() function.

This other old question,

insert portions of a markdown document inside another markdown document using knitr

was for having a father document and child documents which were conditionally compiled, but I don't want to slice my document into so many pieces.


Solution

  • 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.
    ```
    

    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)
    })
    ```