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)

为什么会这样?

4

1 回答 1

9

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

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

并且由于-运算符按元素工作,并且integer(0)没有元素,因此否定不会改变整数向量:

> -integer(0)
integer(0)

sovec[-grep("z", vec)]评估为vec[-integer(0)]which 又评估为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"
于 2013-08-24T01:15:51.913 回答