r - Subsetting on all but empty grep returns empty vector -
suppose have character vector, i'd subset elements don't match regular expression. might use -
operator remove subset grep
matches:
> vec <- letters[1:5] > vec [1] "a" "b" "c" "d" "e" > vec[-grep("d", vec)] [1] "a" "b" "c" "e"
i'm given except entries matched "d"
. if search regular expression isn't found, instead of getting expect, nothing back:
> vec[-grep("z", vec)] character(0)
why happen?
it's because grep
returns integer vector, , when there's no match, returns integer(0)
.
> grep("d", vec) [1] 4 > grep("z", vec) integer(0)
and since -
operator works elementwise, , integer(0)
has no elements, negation doesn't change integer vector:
> -integer(0) integer(0)
so vec[-grep("z", vec)]
evaluates vec[-integer(0)]
in turn evaluates vec[integer(0)]
, character(0)
.
you behavior expect 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"
Comments
Post a Comment