Этот ответ больше предназначен для объяснения почему, а не как. Оператор '=='
в R векторизован так же, как оператор '+'
. Он сопоставляет элементы того, что находится слева, с элементами того, что находится справа, для каждого элемента. Например:
> 1:3 == 1:3
[1] TRUE TRUE TRUE
Здесь первый тест 1==1
, который ИСТИНА, второй 2==2
и третий 3==3
. Обратите внимание, что это возвращает FALSE в первом и втором элементе, потому что порядок неправильный:
> 3:1 == 1:3
[1] FALSE TRUE FALSE
Теперь, если один объект меньше другого объекта, то меньший объект повторяется столько раз, сколько требуется, чтобы соответствовать большему объекту. Если размер большего объекта не является умножением на размер меньшего объекта, вы получите предупреждение о том, что не все элементы повторяются. Например:
> 1:2 == 1:3
[1] TRUE TRUE FALSE
Warning message:
In 1:2 == 1:3 :
longer object length is not a multiple of shorter object length
Здесь первое совпадение 1==1
, затем 2==2
и, наконец, 1==3
(ЛОЖЬ), потому что левая сторона меньше. Если одна из сторон является только одним элементом, то это повторяется:
> 1:3 == 1
[1] TRUE FALSE FALSE
Правильный оператор для проверки, находится ли элемент в векторе, действительно '%in%'
, который векторизован только для левого элемента (для каждого элемента в левом векторе он проверяется, является ли он частью какого-либо объекта в правом элементе ).
В качестве альтернативы, вы можете использовать '&'
для объединения двух логических операторов. '&'
берет два элемента и поэлементно проверяет, являются ли оба ИСТИНАМИ:
> 1:3 == 1 & 1:3 != 2
[1] TRUE FALSE FALSE