基本R函数paste
和paste0
允许连接字符串(显然在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
则返回空字符串)?
答案 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
。