Вставьте разрывы строки в длинную строку — переход на новую строку

Вот функция, которую я записал для повреждения длинной строки в строки не дольше, чем данная длина

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

Это работает на проблему, которую я имел; но интересно, могу ли я изучить что-то здесь. Существует ли более короткое или более эффективное решение, особенно я могу избавиться от для цикла?

22
задан Karsten W. 28 February 2010 в 16:48
поделиться

2 ответа

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

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

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

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

lineLen <- 0

на

lineLen <- wordLen[i]
44
ответ дан 29 November 2019 в 03:25
поделиться

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

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

4
ответ дан 29 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: