Как разбить строки в сообщениях в markdown / knitr? - PullRequest
1 голос
/ 03 мая 2019

Я хочу создать виньетку для пакета R, используя уценку (knitr) и вывод PDF.Некоторые из моих функций выдают сообщения, которые красиво разбиты на строки в консоли.Однако в полученном PDF-файле строки не помещаются в блок для фрагмента кода, а переполняются.

Я пытался использовать strwrap и writeLines в message с шириной = 80 (см. Примеры),Он разбивает строки в нужных местах, но я должен использовать con = stdout() в writeLines, чтобы увидеть результат в PDF-файле уценки.

con = stderr() (по умолчанию) не показывает сообщение.Однако, таким образом, вывод консоли больше не форматируется так же, как обычные сообщения (красный в моем случае), а как обычный вывод (черный).

mes <- "A very, very, very, very, very, very, very, very, very, very, very, very, very, very long message."

# default settings 
message(mes)

# using writeLines and strwrap
message(writeLines(strwrap(mes, width = 80, con = stderr()))
message(writeLines(strwrap(mes, width = 80), con = stdout())

Вот результаты в консоли R

console

и в уценке pdf:

markdown pdf

Моим предпочтительным решением было бы не форматировать сообщения, а найти правильныйвзломать для уценки / knitr.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Я бы не использовал writeLines, я бы сделал перенос и затем передал бы строку в message. Например,

mes <- "A very, very, very, very, very, very, very, very, very, very, very, very, very, very long message."

# default settings 
message(mes)

# pasted together
message(paste(strwrap(mes, width = 80), collapse = "\n"))

Трудно писать каждый раз, поэтому, если вы делаете это часто, я бы включил это в функцию:

wrapmessage <- function(mes, width = 80) 
 message(paste(strwrap(mes, width = width), collapse = "\n"))

, а затем используйте его так:

wrapmessage(mes)      # 80 chars
wrapmessage(mes, 40)  # 40 chars

Последний выглядит так:

enter image description here

0 голосов
/ 06 мая 2019

Я нашел решение, следуя совету Аосмита, используя hook_outputs.Мне пришлось переопределить его по сравнению с примером, приведенным в ссылке, чтобы применить к сообщениям, а не к общему выводу:

hook_output = knit_hooks$get('message')
knit_hooks$set(message = function(x, options) {
  # this hook is used only when the linewidth_mes option is not NULL
  if (!is.null(n <- options$linewidth_mes)) {
    x = knitr:::split_lines(x)
    # any lines wider than n should be wrapped
    if (any(nchar(x) > n)) x = strwrap(x, width = n)
    x = paste(x, collapse = '\n')
  }
  hook_output(x, options)
})

Однако я также понял, что форматирование и правильность его работы сильно зависят от символаопределено для комментариев в opts_chunk$set.

...