在 knitr 输出中文本换行超长,如何解决(RStudio)

10
我有一个长的向量字符串(DNA序列),长度长达几千个连续字符,我想将其添加到我的knitr报告输出中。在RStudio中,文本换行处理得非常完美,但当我生成knitr HTML输出时,只能看到一行文本,并且它会顺着页面滚动。
RStudio输出
knitr输出
有没有办法调整knitr输出以换行?
谢谢。

尝试过了,但是不起作用。 - biomiha
我刚意识到你有一个向量而不是一个长字符串。你能提供一个最小可重现的例子吗? - daroczig
1个回答

8
我建议您尝试使用 R Markdown v2。默认的HTML模板会为您进行文字换行。这是通过HTML标签pre/code的CSS定义实现的,例如word-wrap: break-word; word-break: break-all;。这些定义实际上来自Bootstrap(目前rmarkdown使用Bootstrap 2.3.2)。
您仍在使用R Markdown的第一个版本,即markdown包。您可以使用一些自定义的CSS定义来实现相同的目标,这只需要您学习更多关于HTML/CSS的知识。
另一个解决方案是使用我下面编写的函数str_break()手动打断长字符串:
A helper function `str_break()`:

```{r setup}
str_break = function(x, width = 80L) {
  n = nchar(x)
  if (n <= width) return(x)
  n1 = seq(1L, n, by = width)
  n2 = seq(width, n, by = width)
  if (n %% width != 0) n2 = c(n2, n)
  substring(x, n1, n2)
}
```

See if it works:

```{r test}
x = paste(sample(c('A', 'C', 'T', 'G'), 1000, replace = TRUE), collapse = '')
str_break(x)
cat(str_break(x), sep = '\n')
```

strwrap() 函数出现问题,字符串仍然超出屏幕。到目前为止,我使用的最佳方法是使用 CSS def "overflow-wrap: break-word",但如何在多个字符串之间插入换行符?例如:<div style="overflow-wrap: break-word">paste(sample(c("A","C","T","G"),1000,replace=T),collapse="") paste(sample(c("A","C","T","G"),1000,replace=T),collapse="")</div> - biomiha
@biomiha,strwrap()在你的情况下无法工作,因为字符串中没有空格,所以它不知道如何正确地断开字符串。我会给你一个替代函数。最简单的解决方案是我之前说过的:使用rmarkdown(http://rmarkdown.rstudio.com)。如果你真的想要搞定CSS,那也可以,但你需要更多地了解markdown包,以及如何自定义模板等(https://support.rstudio.com/hc/en-us/articles/200552186-Customizing-Markdown-Rendering),这可能需要你花费几个小时的时间。 - Yihui Xie
是的,str_break函数非常完美。谢谢Yihui。 - biomiha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接