2013-08-24 26 views
5

Załóżmy, że mam wektor znaków, który chciałbym podzestawić na elementy, które nie pasują do jakiegoś wyrażenia regularnego. Mógłbym użyć operatora - usunąć podzbiór że grep meczów:Podział na wszystkie oprócz pustych grep zwraca pusty wektor

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

mi zwrócone wszystko z wyjątkiem wpisów dopasowanych "d". Ale jeśli szukać wyrażenia regularnego, że nie zostanie znaleziony, zamiast się wszystko z powrotem, jak bym się spodziewał, otrzymuję nic powrotem:

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

Dlaczego tak się dzieje?

Odpowiedz

8

To dlatego, że grep zwraca wektor całkowity, a gdy nie ma dopasowania, zwraca integer(0).

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

a ponieważ operator - działa elementwise i integer(0) ma żadnych elementów, negacja nie zmienia wektor integer:

> -integer(0) 
integer(0) 

tak vec[-grep("z", vec)] rozpoznawaną vec[-integer(0)] co z kolei ocenia się vec[integer(0)] , który jest character(0).

Dostaniesz zachowanie można oczekiwać z 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"