Нарезанный вывод с использованием message() в отчете R Markdown/Knitr

Недавно я отправил пакет в 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?


person landau    schedule 20.11.2017    source источник
comment
С другой стороны, был ли этот пакет уже в CRAN, или вы отправили его Robensci до CRAN?   -  person amrrs    schedule 20.11.2017
comment
Есть ли конкретная причина, по которой они просят использовать message вместо этого? По умолчанию message выводит на stderr, поэтому я думаю, что вы видите эту проблему - по той же причине ошибки получают свои собственные строки. Со страницы справки message: обработчик по умолчанию отправляет сообщение соединению stderr().   -  person Dason    schedule 20.11.2017
comment
Сейчас я использую message(), потому что rOpenSci предпочитает его , утверждая, что пользователю проще подавить, чем cat(). Сам пакет находился в CRAN почти год и только сейчас (надеюсь) переместился и в rOpenSci.   -  person landau    schedule 20.11.2017


Ответы (2)


Я думаю, что решил это: knitr имеет опцию чанка collapse. Все, что мне было нужно, это поставить этот фрагмент перед любым другим фрагментом.

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

Вывод получился более сжатым, чем я ожидал, но после некоторой доработки форматирование стало выглядеть намного лучше.

person landau    schedule 20.11.2017

Вы можете попробовать построить строку и поместить функцию сообщения вне цикла, например:

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

person Rutger    schedule 20.11.2017
comment
Извините, мой пакет таков, что я не могу заранее объединить все сообщения воедино. - person landau; 20.11.2017