2013-08-24 10 views
5

Предположим, у меня есть вектор символов, который я бы хотел подмножить элементам, которые не соответствуют некоторому регулярному выражению. Я мог бы использовать оператор - удалить подмножество, grep спичек:Подмножество на всех, кроме пустой 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) 

Почему это происходит?

ответ

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" 

 Смежные вопросы

  • Нет связанных вопросов^_^