Форматировать сообщение об ошибке, избегая новых строк в Rmarkdown

Я изучаю возможности cat() а также message() отформатировать вывод моих функций.

Когда я использую cat(fill = TRUE) новая строка добавляется в конец сообщения, что позволяет красиво распечатать последующие сообщения. Когда я установил fill = FALSEэти сообщения печатаются в одной строке.

По какой-то причине это поведение печати меняется, когда я запускаю код неинтерактивно и связываю код с помощью rmarkdown. Сообщение один раз в одной строке теперь разделено на несколько строк - и я не могу понять, почему или как это исправить. (это не относится к интерактивным сессиям, скажем, в Rstudio)

Пожалуйста, посмотрите минимальный пример ниже и попробуйте его интерактивно, чтобы увидеть разницу.

Rmarkdown выход

print_messages <- function(newline = TRUE){
  cat("1st line", fill = newline)
  message("2nd line")
}

print_messages()
#> 1st line
#> 2nd line
print_messages(newline = FALSE)  # this is, where the difference occurs
#> 1st line
#> 2nd line

Интерактивный вывод

print_messages <- function(newline = TRUE){
  cat("1st line", fill = newline)
  message("2nd line")
}

print_messages()
#> 1st line
#> 2nd line
print_messages(newline = FALSE)  # this is, where the difference occurs
#> 1st line2nd line

Создано 2019-02-04 пакетом представлением (v0.2.1)

1 ответ

Решение

Это связано с тем, что обычный вывод чанка и сообщения обрабатываются отдельно в соответствующих хуках. В процессе переносы строк (\n) вставляются до и после вывода cat() так же как message(), Вы можете пролить свет на это, выполнив следующие действия в начале документа RMarkdown:

```{r, echo = F}
defMessageHook <- knitr::knit_hooks$get("message")
knitr::knit_hooks$set(message = function(x, options) {
    x <- defMessageHook(x, options)  # Apply default hook
    print(x)
    return(x)
})
```

Здесь мы сохраняем перехват сообщений по умолчанию и переопределяем его. В новом хуке мы применяем хук по умолчанию и добавляем print() заявление, чтобы увидеть, что хук по умолчанию сделал из нашего сообщения (проверьте панель R Markdown рядом с вашей консолью):

[1] "\n\n```\n## 2nd line\n```\n\n"
[1] "\n\n```\n## 2nd line\n```\n\n"

Как вы можете видеть, фрагмент кода Markdown упакован переносами строк.

Другие вопросы по тегам