r语言 - 为什么 paste() 以错误的顺序连接列表元素?



给定以下字符串:

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"

最新更新