除了空grep之外的所有子集都返回空向量

时间:2013-08-24 01:15:52

标签: r vector grep operators grepl

假设我有一些字符向量,我想将其子集化为与正则表达式不匹配的元素。我可以使用-运算符删除grep匹配的子集:

> vec <- letters[1:5]
> vec
[1] "a" "b" "c" "d" "e"
> vec[-grep("d", vec)]
[1] "a" "b" "c" "e"

除了匹配"d"的条目外,我还给了所有内容。但是如果我搜索一个未找到的正则表达式,而不是像我期望的那样得到所有东西,我什么也得不回来:

> vec[-grep("z", vec)]
character(0)

为什么会这样?

1 个答案:

答案 0 :(得分:9)

这是因为grep返回一个整数向量,当没有匹配时,它返回integer(0)

> grep("d", vec)
[1] 4
> grep("z", vec)
integer(0)

并且由于-运算符按元素运行,integer(0)没有元素,否则不会更改整数向量:

> -integer(0)
integer(0)

所以vec[-grep("z", vec)]评估为vec[-integer(0)],后者又评估为vec[integer(0)]character(0)

您将获得invert = TRUE所期望的行为:

> vec[grep("d", vec, invert = TRUE)]
[1] "a" "b" "c" "e"
> vec[grep("z", vec, invert = TRUE)]
[1] "a" "b" "c" "d" "e"