为什么 paste() 以错误的顺序连接列表元素?
Why does paste() concatenate list elements in the wrong order?
给定以下字符串:
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"
不使用冒号运算符时 returns 正确顺序:
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"
为什么会这样?
我们可以用collapse
代替sep
paste(my.splt.str[[1]], collapse= ' ')
如果我们使用 OP 的第一种方法,它是 paste
ing 每个子集中的相应元素
如果我们要有选择地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]
的第一个元素是 paste
的第一个元素v1[3:4]
和第二个元素
paste(v1[1:2], v1[3:4], collapse = ' ')
#[1] "I you welcome my"
记录在?paste
paste converts its arguments (via as.character) to character strings, and concatenates them (separating them by the string given by sep). If the arguments are vectors, they are concatenated term-by-term to give a character vector result. Vector arguments are recycled as needed, with zero-length arguments being recycled to "".
此外,也可以在不拆分的情况下对子字符串进行大写转换
sub("^(\w+\s+\w+)\s+(\w+\s+\w+)", "\1 \U\2", my.str, perl = TRUE)
#[1] "I welcome YOU MY precious dude"
paste
旨在逐个元素地处理向量。假设你这样做了:
names <- c('Alice', 'Bob', 'Charlie')
paste('Hello', names)
您希望结果为 [1] "Hello Alice" "Hello Bob" "Hello Charlie"
,而不是 "Hello Hello Hello Alice Bob 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"
给定以下字符串:
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"
不使用冒号运算符时 returns 正确顺序:
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"
为什么会这样?
我们可以用collapse
代替sep
paste(my.splt.str[[1]], collapse= ' ')
如果我们使用 OP 的第一种方法,它是 paste
ing 每个子集中的相应元素
如果我们要有选择地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]
的第一个元素是 paste
的第一个元素v1[3:4]
和第二个元素
paste(v1[1:2], v1[3:4], collapse = ' ')
#[1] "I you welcome my"
记录在?paste
paste converts its arguments (via as.character) to character strings, and concatenates them (separating them by the string given by sep). If the arguments are vectors, they are concatenated term-by-term to give a character vector result. Vector arguments are recycled as needed, with zero-length arguments being recycled to "".
此外,也可以在不拆分的情况下对子字符串进行大写转换
sub("^(\w+\s+\w+)\s+(\w+\s+\w+)", "\1 \U\2", my.str, perl = TRUE)
#[1] "I welcome YOU MY precious dude"
paste
旨在逐个元素地处理向量。假设你这样做了:
names <- c('Alice', 'Bob', 'Charlie')
paste('Hello', names)
您希望结果为 [1] "Hello Alice" "Hello Bob" "Hello Charlie"
,而不是 "Hello Hello Hello Alice Bob 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"