Форматировать сообщение об ошибке, избегая новых строк в 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 упакован переносами строк.