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

6
假设我有一些字符向量,我想将其子集到与某些正则表达式不匹配的元素。 我可以使用-运算符来删除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个回答

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"

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