[英]How to break lines in messages in markdown / knitr?
我想使用markdown( knitr
)和pdf输出为R包创建一个插图。 我的一些函数产生的信息很好地分解为控制台中的行。 但是,在生成的pdf中,行不适合代码块的框但是溢出。
我尝试在宽度= 80的message
使用strwrap
和writeLines
(参见示例)。 它确实在正确的位置打破了行,但我必须在writeLines
使用con = stdout()
来查看markdown 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控制台中的结果
并在降价pdf:
我的首选解决方案不是格式化消息,而是找到正确的降价/编织器黑客。
我不会使用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
后者看起来像这样:
我找到了使用hook_outputs的aosmith建议后的解决方案。 与应用于消息的链接中给出的示例相比,我不得不重新定义它,而不是一般输出:
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
注释定义的字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.