如何在R中正确嵌套paste()函数?

时间:2014-01-09 04:14:55

标签: r

你能告诉我为什么

paste(paste(c("first", "second"), collapse=", "), "third", collapse=" and ")

给了我

"first, second third"

而不是

"first, second and third"

?获得第二个输出的正确语法是什么?

3 个答案:

答案 0 :(得分:7)

解释

这是你调用函数的一个细微差别。在

paste(c("first", "second"), collapse = ", ")

请注意,您只通过...传递一个参数,这是一个长度为2的向量。这会导致返回长度为1的向量:

> paste(c("first", "second"), collapse = ", ")
[1] "first, second"

然后通过外部...中的paste()传递此长度1向量第二长度1向量。实际上你正在做:

paste("first, second", "third", collapse = " and ")

由于两个提供的向量都是长度为1,因此没有任何内容可以折叠,这两个字符串只是与分隔符sep连接在一起。

因此,在第一种情况下,

paste(c("first", "second"), collapse = ", ")

没有第二个向量将值粘贴到第一个向量上,因此paste()使用c("first", "second")作为分隔符折叠单个向量", "的元素。但是当你传入两个长度为1的向量时,在

paste("first, second", "third", collapse = " and ")

该函数使用"first, second third"将两个字符串连接成一个字符串sep,然后因为只有一个长度为1个字符,所以没有任何内容可以折叠。

具体解决方案

如果你想要的只是字符串"first, second, and third"并且根据你的例子你有输入,那么只需切换到使用sep = ", and "

paste(paste(c("first", "second"), collapse=", "), "third", sep = ", and ")

给出了

> paste(paste(c("first", "second"), collapse=", "), "third", sep = ", and ")
[1] "first, second, and third"

> paste(paste(c("first", "second"), collapse=", "), "third", sep = " and ")
[1] "first, second and third"

如果您不想要牛津逗号。

摘要

查看sepcollapse与提供的输入的关系的最简单方法。两个例子是说明性的:

> paste(1:5, letters[1:5], LETTERS[1:5], sep = " ")
[1] "1 a A" "2 b B" "3 c C" "4 d D" "5 e E"
> paste(1:5, letters[1:5], LETTERS[1:5], sep = " ", collapse = "-")
[1] "1 a A-2 b B-3 c C-4 d D-5 e E"

我们观察到两个特征:

  1. sep以元素方式应用于输入向量,例如到1aA;然后是2bB;等等。
  2. collapse适用于使用sep 的第一个粘贴步骤的结果,如果通过将元素与给定的分隔符连接而得到长度为> = 2的向量通过论证collapse。如果没有collapsepaste()可以返回多个字符串的向量,如果给定向量输入,但指定collapse时,将仅返回长度为1的字符向量。

答案 1 :(得分:1)

或使用:

paste(paste(c("first", "second"), collapse=", "), "third", sep=", and ")
## "first, second, and third"

请参阅这篇关于粘贴的博文:http://trinkerrstuff.wordpress.com/2013/09/15/paste-paste0-and-sprintf-2/

答案 2 :(得分:1)

让我们分解一下:

第一部分:

> paste(c("first", "second"), collapse=", ")
#[1] "first, second"

第二部分:

> paste("first, second", "third", collapse=" and ")
#[1] "first, second third"

使用sep =而不是collapse =

> paste("first, second","third",sep=" and ")
#[1] "first, second and third"

因此您可以使用:

> paste(paste(c("first", "second"), collapse=", "), "third",sep=", and ")
#[1] "first, second, and third"