About debug messages in knitr

2024-04-09

When writing markdown documents for processing with knitr, warnings and messages are usually shown in the output document.

Often, I also want to print debug messages to the console, e.g. for indicating progress etc.

For this purpose, I was using the code chunk option message=FALSE, which made the output of message() show up in the console rather than in the output document:

---
title: "Example document"
output:
  html_document

---

My doc does things.

```{r chunk1, echo=FALSE, message=FALSE}
message("DOING THINGS")
```

```{r chunk2, echo=FALSE, message=FALSE}
message("DOING OTHER THINGS")
```

Console output when knitting:

processing file: example.Rmd
  |..............                                                        |  20%
  ordinary text without R code

  |............................                                          |  40%
label: chunk1 (with options)
List of 2
 $ echo   : logi FALSE
 $ message: logi FALSE

DOING THINGS
  |..........................................                            |  60%
  ordinary text without R code

  |........................................................              |  80%
label: chunk2 (with options)
List of 2
 $ echo   : logi FALSE
 $ message: logi FALSE

DOING OTHER THINGS
  |......................................................................| 100%
  ordinary text without R code

At some point recently, I noticed that these messages no longer showed up in the console output, but were also not visible in the output documents and I was questioning myself if it actually ever worked.

After some googling, I found this post by yihui, the author of the knitr package. It turns out that in versions from 0.19 of the evaluate package used by knitr, the meaning of the chunk options warning and message changed, so that FALSE really means no output at all.

Instead, one needs to set the option to NA for getting the console output again, i.e.:

```{r chunk1, echo=FALSE, message=NA}
message("DOING THINGS")
```

Of course, these options can also be set globally for all code chunks, using:

knitr::opts_chunk$set(echo = FALSE, message = NA)

at the beginning of the document.

All chunk options and package options for knitr are shown here at knitr’s website and there are also ways for reusing options.