Вставить разрывы строк в длинную строку - перенос слов - PullRequest
21 голосов
/ 28 февраля 2010

Вот функция, которую я написал, чтобы разбить длинную строку на строки не длиннее заданной длины

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?

Ответы [ 4 ]

44 голосов
/ 28 февраля 2010

Как насчет этого:

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

Будет разбивать строку «s» на строки с максимум 90 символами (за исключением символа разрыва строки «\ n», но с пробелами между словами), если только само слово не превышает 90 символов, то само это слово будет занимают целую линию.

Кстати, ваша функция кажется сломанной --- вы должны заменить

lineLen <- 0

с

lineLen <- wordLen[i]
22 голосов
/ 24 апреля 2015

Для полноты комментария Карстен У. указывает на strwrap, что является самой простой функцией для запоминания:

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

и для точного совпадения с решением, предложенным в вопросе, строка должна быть вставлена ​​впоследствии:

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

Эта публикация сделана сообществом вики, поскольку честь найти эту функцию не принадлежит мне.

13 голосов
/ 23 июля 2015

Для дальнейшей полноты есть:

  • stringi::stri_wrap
  • stringr::str_wrap (что в конечном итоге вызывает stringi::stri_wrap

Версия stringi будет лучше работать с наборами символов (она построена на библиотеке ICU) и находится на C / C ++, поэтому в конечном итоге она будет быстрее, чем base::strwrap. Это также векторизовано по параметру str.

4 голосов
/ 28 февраля 2010

Вы можете посмотреть, например, write.dcf() ФУНКЦИЯ в самом R; он также использует цикл, так что здесь нечего стыдиться.

Первая цель - сделать все правильно - см. Chambers (2008).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...