给定以下字符串:
my.str <- "I welcome you my precious dude"
一个拆分它:
my.splt.str <- strsplit(my.str, " ")
然后连接:
paste(my.splt.str[[1]][1:2], my.splt.str[[1]][3:4], my.splt.str[[1]][5:6], sep = " ")
结果是:
[1] "I you precious" "welcome my dude"
不使用冒号运算符时,它返回正确的顺序:
paste(my.splt.str[[1]][1], my.splt.str[[1]][2], my.splt.str[[1]][3], my.splt.str[[1]][4], my.splt.str[[1]][5], my.splt.str[[1]][6], sep = " ")
[1] "I welcome you my precious dude"
为什么会这样?
paste
被设计为逐个元素地处理向量。假设你这样做了:
names <- c('Alice', 'Bob', 'Charlie')
paste('Hello', names)
你希望结果是[1] "Hello Alice" "Hello Bob" "Hello Charlie"
,而不是"你好你好爱丽丝鲍勃查理"。
为了使它像你想要的那样工作,而不是将不同的部分作为单独的参数paste
,你可以首先将它们组合成一个向量,c
:
paste(c(my.splt.str[[1]][1:2], my.splt.str[[1]][3:4], my.splt.str[[1]][5:6]), collapse = " ")
## [1] "I welcome you my precious dude"
我们可以用collapse
代替sep
paste(my.splt.str[[1]], collapse= ' ')
如果我们使用 OP 的第一种方法,它是从每个子集中paste
相应的元素
如果我们想有选择地paste
,首先创建一个对象,因为可以避免[[
重复
v1 <- my.splt.str[[1]]
v1[3:4] <- toupper(v1[3:4])
paste(v1, collapse=" ")
#[1] "I welcome YOU MY precious dude"
当我们在paste
中有多个参数时,它正在对它的相应元素进行粘贴
paste(v1[1:2], v1[3:4])
#[1] "I you" "welcome my"
如果我们使用collapse
,那么它将是一个字符串,但顺序仍然不同,因为v1[1:2]
的第一个元素与v1[3:4]
的第一个元素paste
,第二个元素与第二个元素
paste(v1[1:2], v1[3:4], collapse = ' ')
#[1] "I you welcome my"
它记录在?paste
paste 将其参数(通过 as.character(转换为字符串,并将它们连接起来(由 SEP 给出的字符串分隔它们(。如果参数是向量,则它们将逐项连接以给出字符向量结果。根据需要回收矢量参数,零长度参数将回收为 "。
此外,可以在子字符串上转换为大写而无需拆分
sub("^(\w+\s+\w+)\s+(\w+\s+\w+)", "\1 \U\2", my.str, perl = TRUE)
#[1] "I welcome YOU MY precious dude"