Функции R grep
и !grep
(НЕ grep) логически не согласованы; в отличие от grepl
и !grepl
(НЕ grepl), которые логически непротиворечивы.
grepl
возвращает логический вектор, длина которого равна количеству искомых элементов. Например, если цель найдена в элементах 2 и 3 вектора из 5 элементов, возвращается следующее:
FALSE TRUE TRUE FALSE FALSE
Если grepl
заменить на !grepl
, то возвращается "противоположный" логический результат:
TRUE FALSE FALSE TRUE TRUE
grep
, с другой стороны, возвращает вектор двух позиций найденных элементов: 2 3
Что возвращает !grep
в том же сценарии? Логически он должен вернуть 1 4 5
, вместо этого он возвращает FALSE FALSE
. Как это может быть логически непротиворечивым возвращаемым значением? Кто-нибудь может объяснить?
grep
возвращает вектор 0+ изinteger
s, оператор!
(инверсия логики) для них не определен. Можете ли вы сказать мне с уверенностью, что означаетinvert_logic 5:7
? (Если вы знаете длину вектора, вы можете вывести1:4,8:n
, но это самонадеянно.) Посколькуgrepl
возвращает вектор 0+ изlogical
s, имеет смысл сказатьinvert_logic c(T,T,F,T)
, и поскольку вы индексируете вектор с той же длиной вектор логических (инвертированный или иной), вы молодец. (Кстати:letters[ -grep("[f-h]", letters ]
эффективно инвертирует.) - person r2evans   schedule 09.07.2016grep(..., invert = TRUE)
. Я думаю, это то, что вы хотите. - person Rich Scriven   schedule 09.07.2016grep
возвращает индексы, соответствующие шаблону, аgrepl
возвращает логический вектор; 2) оператор!
приводит свой аргумент кlogical
. Попробуйте, например,!c(0,2,4)
, и вы увидите, что это эквивалентно!as.logical(c(0,2,4))
; 3) проверьте аргументinvert
grep
. - person nicola   schedule 09.07.2016!
(обратная логика) не определен для целого числа, это неверно. Вы можете использовать!
на векторахinteger
иnumeric
. - person nicola   schedule 09.07.2016! 5:7
получениеF,F,F
противоречит здравому смыслу, если вы не думаете, что0
иFALSE
эквивалентны. Спасибо за исправление (вы абсолютно правы), и это еще раз подчеркивает, почему это не будет работать (и, по общему признанию, возможно, некоторое несоответствие в том, как R и другие языки преобразуют типы в логические значения и из них). - person r2evans   schedule 09.07.2016!5:7
нелогичен и о каких несоответствиях вы говорите. 0 — этоFALSE
, а любое другое число — этоTRUE
при принуждении кlogical
, вот и все. - person nicola   schedule 09.07.2016! grep(...)
состоит в том, чтобы выбрать противоположные индексы, а не превращать все числа вFALSE
. (Я часто (аб) использую условные выражения, такие какif (length(x)) { ... }
, подразумевая, что ненулевое число — этоTRUE
, а 0 — этоFALSE
.) Вы правы, @nicola, и тем, кто изучает использованиеgrep{,l}
, просто нужно изучить соответствующие варианты использования. . - person r2evans   schedule 09.07.2016!grep
- это не функция (как они, кажется, подразумевают), а две функции, и оператор!
применяется к результату, полученномуgrep
, и не меняет поведение изgrep
. - person nicola   schedule 09.07.2016