'R function to start new line every n words?
I want to create an R function that inserts a "\n" after every n words in a string (where n is an argument).
e.g.
startstring <- "I like to eat fried potatoes with gravy for dinner."
myfunction(startstring, 4)
would give:
"I like to eat\nfried potatoes with gravy\nfor dinner."
I believe that to do this I need to split the string up into several parts, each n words long, and then paste these together with a separator of "\n". However I do not know how to do the initial splitting step.
Can anyone advise?
Solution 1:[1]
You could solve this with regular expressions, or with this abomination:
words = strsplit(startstring, ' ')[[1L]]
splits = cut(seq_along(words), breaks = seq(0L, length(words) + 4L, by = 4L))
paste(lapply(split(words, splits), paste, collapse = ' '), collapse = '\n')
But a better way for most practical applications is to use strwrap
to wrap the text at a given column length, rather than by word count:
paste(strwrap(startstring, 20), collapse = '\n')
Solution 2:[2]
You can use below code:
gsub("([a-z0-9]* [a-z0-9]* [a-z0-9]* [a-z0-9]*) ", "\\1\n", startstring)
Solution 3:[3]
You can use gsub
to create an R function that inserts a \n
after every n words, where n is an argument.
fun <- function(str, n) {gsub(paste0("([^ ]+( +[^ ]+){",n-1,"}) +"),
"\\1\n", str)}
fun(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."
fun(startstring, 2)
#[1] "I like\nto eat\nfried potatoes\nwith gravy\nfor dinner."
Where [^ ]+
matches everything but not a space with a length of at least one. ( +[^ ]+){3}
matches at least one spache +
followed by at least one not space [^ ]+
which will in this case be repeated 3 times {3}
.
Or an alternative using \\K
in the pattern instead of \\1
in x:
fun <- function(str, n) {gsub(paste0("[^ ]+( +[^ ]+){",n-1,"}\\K +"),
"\n", str, perl=TRUE)}
or by using strsplit
:
fun2 <- function(str, n) {
paste0(strsplit(str, " +")[[1L]], c(rep(" ",n-1),"\n"), collapse = "")}
fun2(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner. "
or without a space or \n
in the end:
fun3 <- function(str, n) {
. <- strsplit(str, " +")[[1L]]
paste0(., c(rep_len(c(rep(" ",n-1),"\n"), length(.)-1), ""), collapse = "")}
fun3(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."
Or keeping the matched words using \K
also in strsplit
:
fun4 <- function(str, n) {paste(strsplit(str,
paste0("[^ ]+( +[^ ]+){",n-1,"}\\K +"), perl=TRUE)[[1L]], collapse="\n")}
fun4(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."
Solution 4:[4]
This uses spaces to seperate words, in Base-R
gsub("(\\S* \\S* \\S* \\S*) ","\\1\n",startstring)
[1] "I like to eat\nfried potatoes with gravy\nfor dinner."
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | |
Solution 4 | Daniel O |