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

Fra*_*ank 6 grep r vector operators grepl

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

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

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

> vec[-grep("z", vec)]
character(0)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Fra*_*ank 9

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

> grep("d", vec)
[1] 4
> grep("z", vec)
integer(0)
Run Code Online (Sandbox Code Playgroud)

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

> -integer(0)
integer(0)
Run Code Online (Sandbox Code Playgroud)

所以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"
Run Code Online (Sandbox Code Playgroud)