2013-08-24 5 views
5

いくつかの文字ベクトルがあると仮定します。これは正規表現と一致しない要素にサブセットしたいと考えています。私はgrep一致していることサブセットを削除する-演算子を使用する場合があります:私は"d"に一致したエントリを除いてすべてをバック与えられてい空のgrepを除くすべての部分集合は空のベクトルを返します

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

。しかし、私は代わりに私が期待するようバック、すべてを取得する、私は戻って何を取得、発見されない正規表現を検索する場合:

> vec[-grep("z", vec)] 
character(0) 

これはなぜ起こるのでしょうか?

答えて

8

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" 
関連する問題