我试图使用gsub()
将矢量元素中的所有多个(2个或更多)空格字符折叠为单个字符,例如:
x1 <- c(" abc", "a b c ", "a b c")
gsub("\\s{2,}", " ", x1)
[1] " abc" "a b c " "a b c"
但是,只要向量包含NA
,替换就会失败:
x2 <- c(NA, " abc", "a b c ", "a b c")
gsub("\\s{2,}", " ", x2)
[1] NA " " " " " "
但是,如果使用类似Perl的正则表达式,它可以正常工作:
gsub("\\s{2,}", " ", x2, perl = TRUE)
[1] NA " abc" "a b c " "a b c"
有没有人建议为什么R&#39的自己的正则表达式会以这种方式运行?如果有帮助的话,我在Linux x86-64上使用R 3.1.1。
答案 0 :(得分:2)
我没有查看源代码,但如果您使用useBytes=TRUE
参数(没有perl=TRUE
参数),它也可以工作。从帮助:“如果useBytes
是TRUE
,匹配是逐字节而不是逐个字符完成的。”这可能是它失败的部分原因在gsub
。
但是,regexpr
,regexec
和gregexpr
每个都找到了所有正确的位置(我已将\\s
替换为[[:space:]]:
以提高可读性,并仅使用来自regexpr
:
regexpr("[[:space:]]{2,}", x2)
## [1] NA 1 1 1
## attr(,"match.length")
## [1] NA 5 9 6
所以,正则表达式本身就没问题。
更新:快速浏览一下R {3.1}中的do_gsub
grep.c
没有产生太多洞察力(这是if/else
陈述的扭曲迷宫:-),但我会几乎想把这个称为bug。
答案 1 :(得分:1)
只是提出这个问题:正如其他几个人所说,这种行为实际上是一个错误。报告并在此确认: