2013-08-24 10 views
5

Angenommen, ich habe einige Zeichen Vektor, die ich möchte Teilmenge Elemente, die nicht mit einigen regulären Ausdruck übereinstimmen. Ich könnte den - Operator verwenden, um die Teilmenge, dass grep Spiele zu entfernen:Subsetting auf alle, aber leere grep gibt leere Vektor

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

Ich bin alles außer den Einträgen zurück gegeben, die "d" abgestimmt. Aber wenn ich nach einem regulären Ausdruck suchen, die nicht gefunden wird, statt alles immer wieder, wie ich erwarten würde, ich bekomme nichts zurück:

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

Warum geschieht das?

Antwort

8

Es ist, weil grep einen ganzzahligen Vektor zurückgibt, und wenn es keine Übereinstimmung gibt, gibt es integer(0) zurück.

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

und die seit der - Betreiber element arbeitet, und integer(0) hat keine Elemente, nicht die Negation nicht den ganzzahligen Vektor ändern:

> -integer(0) 
integer(0) 

so vec[-grep("z", vec)] ausgewertet vec[-integer(0)] die wiederum ausgewertet vec[integer(0)] , das ist character(0).

Sie das Verhalten, das Sie mit invert = TRUE erwarten erhalten:

> vec[grep("d", vec, invert = TRUE)] 
[1] "a" "b" "c" "e" 
> vec[grep("z", vec, invert = TRUE)] 
[1] "a" "b" "c" "d" "e"