Вот функция, которую я записал для повреждения длинной строки в строки не дольше, чем данная длина
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)
}
Это работает на проблему, которую я имел; но интересно, могу ли я изучить что-то здесь. Существует ли более короткое или более эффективное решение, особенно я могу избавиться от для цикла?
Как насчет этого:
gsub('(.{1,90})(\\s|$)', '\\1\n', s)
Он разобьет строку "s" на строки с максимальным количеством 90 символов (исключая символ перевода строки "\n", но включая межсловные пробелы), если только само слово не превышает 90 символов, тогда это слово будет занимать целую строку.
Кстати, ваша функция кажется сломанной --- вам следует заменить
lineLen <- 0
на
lineLen <- wordLen[i]
Вы можете посмотреть, например, ФУНКЦИЯ write.dcf ()
в самом R; он также использует цикл, так что здесь нечего стыдиться.
Первая цель - сделать это правильно - см. Chambers (2008).