str_split和strsplit之间的行为不一致

9
str_split的文档中说明,对于模式参数:

如果为空字符串,则拆分为单个字符。

这表明在这方面它与strsplit的行为相同。然而,
library(stringr)
str_split("abcab","")
[[1]]
[1] ""  "a" "b" "c" "a" "b"

前导空字符串。与此相比,

strsplit("abcab","")
[[1]]
[1] "a" "b" "c" "a" "b"

分割非空字符串时,前导空字符串似乎是正常行为。
strsplit("abcab","ab")
[[1]]
[1] ""  "c"

但即使如此,str_split 也会生成一个“额外”的尾随空字符串:

str_split("abcab","ab")
[[1]]
[1] ""  "c" "" 

这个差异是一个bug、特性、文档错误还是仅仅是对“预期行为”的不同理解?


1
最好向开发人员提交错误报告,而不是在stackoverflow上提问。 - hadley
3
抱歉 @hadley,我基本上从不认为自己发现了错误。我非常缺乏自信。 - joran
这可能不是一个错误,而是对于“按照给定分隔符拆分字符串”的不同解释。(对于“期望行为”的不同理解。)如果你用分隔符ab来拆分字符串abcab,那么我期望的结果是c。然而,并非所有程序员都以相同的方式进行解释。 - MC Emperor
11年后回顾,现在的行为看起来很相似——错误已经解决。 - Sundancer
1个回答

4
如果您使用逗号作为分隔符,那么“预期”的结果(可能会有所不同)更加明显:
# expect "" "2" "3" "4" ""

strsplit(",2,3,4,", ",")
# [[1]]
# [1] ""  "2" "3" "4"

str_split(",2,3,4,", ",")
# [[1]]
# [1] ""  "2" "3" "4" "" 

如果我有n个逗号,那么我期望返回(n+1)个元素。所以我更喜欢使用str_split的结果。然而,我不会将这称为strsplit中的错误,因为它按照广告运行。
(来自? strplit)请注意,这意味着如果在非空字符串的开头有匹配项,则输出的第一个元素是““”,但是如果在字符串的末尾有匹配项,则输出与删除匹配项相同。
""比较棘手,因为没有办法计算字符串中出现""的次数。因此,将其视为特殊情况似乎是合理的。
(来自? str_split)如果“”分成单个字符。
基于此,我建议您已发现错误并应采用Hadley的建议进行报告!

4
我已经报告了它,因为Hadley是这个函数的作者。 ;) - joran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接