在 R Markdown / knitr 报告中使用 message() 切碎输出

Chopped up output using message() in an R Markdown / knitr report

我最近向 rOpenSci 提交了一个包,他们更喜欢使用 message() 而不是 cat() 作为用户端控制台输出。当我为我的包进行切换时,我注意到渲染的小插图格式发生了令人不安的变化。我在以下 R Markdown 报告中重现了该问题。

---
title: "MWE"
author: "Will Landau"
date: "11/20/2017"
output: html_document
---

```{r testcat}
for(x in LETTERS[1:3]){
  cat(x, "\n")
}
```

```{r testmessage}
for(x in LETTERS[1:3]){
  message(x)
}
```

```{r testmessage2}
for(x in LETTERS[1:3]){
  message(x, "\n", appendLF = FALSE)
}
```

对于第一个代码块,我得到了所需的输出:所有三行都串在一个灰色框中。

## A 
## B 
## C

但是对于第二和第三块,每一行都有自己单独的灰色框。

## A

.

## B

.

## C

如何继续使用 message() 而不会像这样切断 knitr 输出?

您可以尝试构建字符串并将消息函数放在循环之外,如下所示:

```{r testmessage}
single_message <- c()
for(x in LETTERS[1:3]){
  single_message <- paste(single_message , x, sep = "\n")
}
message(single_message )
```

请注意,此示例确实在开头添加了换行符,您可以使用额外的 if 来防止这种情况,或者使用循环外的第一个元素来初始化 single_message.

我想我已经解决了:knitr 有一个 collapse 块选项。我所需要的只是将这个块放在任何其他块之前。

```{r setup}
knitr::opts_chunk$set(collapse = TRUE)
```

输出比我预期的更简洁,但经过一些修饰后,格式现在看起来好多了。