Как разбить строки в сообщениях в markdown/knitr?

54
5

Я хочу создать виньетку для пакета R, используя knitr (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

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

спросил(а) 2019-05-03T17:42:00+03:00 1 год, 2 месяца назад
1
Решение
66

Я бы не использовал 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

ответил(а) 2019-05-03T20:01:00+03:00 1 год, 2 месяца назад
39

Я нашел решение после предложения Aosmith с помощью 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.

ответил(а) 2019-05-06T12:01:00+03:00 1 год, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема