假设我有一些字符向量,我想将其子集化为与正则表达式不匹配的元素。我可以使用-
运算符删除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)
为什么会这样?
答案 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"