如何在markdown / knitr中的消息中换行?

时间:2019-05-03 14:42:54

标签: r markdown r-markdown knitr

我想使用markdown(knitr)和pdf输出为R包创建一个小插图。我的某些函数产生的消息在控制台中很好地分成几行。但是,在生成的pdf中,这些行不适合代码块的框,但会溢出。

我尝试在strwrap内使用{= {1}}和writeLines,宽度= 80(请参见示例)。它确实在正确的位置中断了行,但是我必须在message中使用con = stdout()才能在markdown pdf中查看输出。

writeLines(默认)不显示该消息。但是,通过这种方式,控制台输出的格式不再与普通消息(在我的情况下为红色)相同,而与普通输出(黑色)一样。

con = stderr()

这是R控制台中的结果

console

并在降价pdf中:

markdown pdf

我的首选解决方案是不格式化消息,而是为markdown / knitr找到正确的技巧。

2 个答案:

答案 0 :(得分:3)

我不会使用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

答案 1 :(得分:0)

在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中为注释定义的字符。