【问题标题】:Insert line breaks in long string -- word wrap在长字符串中插入换行符——自动换行
【发布时间】:2011-01-22 01:05:02
【问题描述】:

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

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)
}

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

【问题讨论】:

    标签: string r


    【解决方案1】:

    这个怎么样:

    gsub('(.{1,90})(\\s|$)', '\\1\n', s)
    

    它将字符串“s”分成最多90个字符的行(不包括换行符“\n”,但包括单词间空格),除非有一个单词本身超过90个字符,那么该单词本身将占据一整行。

    顺便说一句,你的功能似乎坏了——你应该更换

    lineLen <- 0
    

    lineLen <- wordLen[i]
    

    【讨论】:

    • 很好的解决方案!我觉得我需要学习正则表达式,也感谢您指出我的函数中的错误。
    • 您能否添加注释说明每个部分的具体作用?
    【解决方案2】:

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

    第一个目标是正确处理 --- 参见 Chambers (2008)。

    【讨论】:

    • 检查 write.dcf(然后检查 formatDL)调出了函数 strwrap,它完全符合我的函数试图做的事情。
    • 完美——我知道有一些东西,但我没有立即找到它。蔓越莓我也需要这个...
    【解决方案3】:

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

    strwrap("Lorem ipsum... you know the routine", width=10)
    

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

    paste(strwrap(s,90), collapse="\n")
    

    这篇文章是特意制作的社区维基,因为找到这个功能的荣誉不属于我。

    【讨论】:

    • 如果你需要这个作为函数,你也可以修改sapply中的strwrap为如下用户定义的公式:trimmer &lt;- function(x,break_limit){ sapply(strwrap(x, break_limit, simplify=FALSE), paste, collapse="\n") }
    【解决方案4】:

    为了进一步完整,有:

    • stringi::stri_wrap
    • stringr::str_wrap(最终调用stringi::stri_wrap

    stringi 版本将更好地处理字符集(它基于 ICU 库构建)并且它使用 C/C++,因此最终会比base::strwrap 更快。它还通过str 参数进行了矢量化处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2017-11-14
      • 2013-05-23
      • 2016-08-05
      • 2012-12-27
      • 2018-12-27
      • 2011-05-04
      相关资源
      最近更新 更多