在长字符串中插入换行符 - 自动换行

Kar*_* W. 22 string r

这是我写的一个函数,用于将长字符串分成不长于给定长度的行

strBreakInLines <- function(s, breakAt=90, prepend="") {
  words <- unlist(strsplit(s, " "))
  if (length(words)<2) return(s)
  wordLen <- unlist(Map(nchar, words))
  lineLen <- wordLen[1]
  res <- words[1]
  lineBreak <- paste("\n", prepend, sep="")
  for (i in 2:length(words)) {
    lineLen <- lineLen+wordLen[i]
    if (lineLen < breakAt) 
      res <- paste(res, words[i], sep=" ")
    else {
      res <- paste(res, words[i], sep=lineBreak)
      lineLen <- 0
    }
  }
  return(res)
}
Run Code Online (Sandbox Code Playgroud)

它适用于我遇到的问题; 但我想知道我是否可以在这里学到一些东西.是否有更短或更有效的解决方案,尤其是我可以摆脱for循环?

xie*_*hao 44

这个怎么样:

gsub('(.{1,90})(\\s|$)', '\\1\n', s)
Run Code Online (Sandbox Code Playgroud)

它会将字符串"s"分成最多90个字符的行(不包括换行符"\n",但包括字间空格),除非有一个字本身超过90个字符,那么该字本身将占用一个整体线.

顺便说一下,你的功能似乎已经破碎了 - 你应该更换

lineLen <- 0
Run Code Online (Sandbox Code Playgroud)

lineLen <- wordLen[i]
Run Code Online (Sandbox Code Playgroud)

  • 您能否添加注释来解释每个部分的具体作用? (2认同)

Dee*_*ter 23

为了完整起见,Karsten W.的评论指出strwrap,这是最容易记住的功能:

strwrap("Lorem ipsum... you know the routine", width=10)
Run Code Online (Sandbox Code Playgroud)

并且要完全匹配问题中提出的解决方案,之后必须粘贴字符串:

paste(strwrap(s,90), collapse="\n")
Run Code Online (Sandbox Code Playgroud)

这篇文章是故意制作社区维基,因为找到该功能的荣誉不是我的.


hrb*_*str 14

为了进一步完整,有:

  • stringi::stri_wrap
  • stringr::str_wrap (这最终要求 stringi::stri_wrap

stringi版本将更好地处理字符集(它建立在ICU库上)并且它在C/C++中,所以它最终会比它更快base::strwrap.它也在str参数上进行了矢量化.


Dir*_*tel 5

您可以查看例如write.dcf()R 本身中的FUNCTION;它还使用了一个循环,所以这里没有什么可羞耻的。

第一个目标是做对——见钱伯斯 (2008)。

  • 检查 write.dcf(然后是 formatDL)提出了 strwrap 函数,该函数正是我的函数试图做的。 (3认同)