簡體   English   中英

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

[英]How to break lines in messages in markdown / knitr?

我想使用markdown( knitr )和pdf輸出為R包創建一個插圖。 我的一些函數產生的信息很好地分解為控制台中的行。 但是,在生成的pdf中,行不適合代碼塊的框但是溢出。

我嘗試在寬度= 80的message使用strwrapwriteLines (參見示例)。 它確實在正確的位置打破了行,但我必須在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:

降價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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM