如何将字符串连接到可能的空字符向量的每个元素?

时间:2015-09-06 17:33:29

标签: r

基本R函数pastepaste0允许连接字符串(显然在R中称为字符)。

例如:

>new_people <- c(" R. A. Becker", "J. M. Chambers", "A. R. Wilks")
>paste0("Hello ",new_people,"!")
[1] "Hello  R. A. Becker!"  "Hello J. M. Chambers!" "Hello A. R. Wilks!" 

但是如果一个参数长度为零(character()),那么它表现出不一致和意外(对我而言):

> new_people <- character()
> paste0("Hello ",new_people,"!")
[1] "Hello !"

?paste中描述了这种行为(但没有动机):

  

根据需要回收向量参数,将零长度参数循环到&#34;&#34;。   [...]   值:   连接值的字符向量。如果所有对象都是,则长度为零,除非collapse为非NULL,在这种情况下它是一个空字符串。

如果你没有发现它&#34;不一致&#34;但想象一下Equivalent of R's paste command for vector of numbers in Python的答案会真正重现paste的行为。

为了避免我的代码混乱,我没有成功地为paste搜索只能回收长度为1的参数的替代函数或参数。 @ hadley&#39; str_c包中的stringr函数确实没有提供此行为。

是否有替代粘贴(和paste0)的行为符合w.r.t.零长度参数(即在这种情况下返回零长度字符向量,如果collapse不是NULL则返回空字符串)?

2 个答案:

答案 0 :(得分:2)

在写这个问题时,我发现了一个几乎令人满意的答案:

> new_people <- c(" R. A. Becker", "J. M. Chambers", "A. R. Wilks")
> sprintf("Hello %s!",new_people)
[1] "Hello  R. A. Becker!"  "Hello J. M. Chambers!" "Hello A. R. Wilks!"   
> new_people <- character()
> sprintf("Hello %s!",new_people)
character(0)

然而,这缺乏变量之间的良好联系以及它们在paste所具有的字符串中的位置,并且如果想要将字符串拼接在一起,则需要额外的周围paste(..., collapse="~")

答案 1 :(得分:1)

在R 4.0.1中,.recycle0(请参阅NEWS)引入了新的自变量paste

paste0

new_people <- character() paste0("Hello ", new_people, "!", recycle0 = TRUE) # character(0) 搭配使用也很不错:

collapse=TRUE

当前的默认值为new_people <- character() paste0("Hello ", new_people, "!", collapse = "\n", recycle0 = TRUE) # "" ,希望在不久的将来有一天可以将其默认更改为FASLE