R gotcha: логический - и оператор для комбинирования условий - & not &&

Почему subset() не работает с логическим и && оператором, объединяющим два условия?

> subset(tt, (customer_id==177 && visit_date=="2010-08-26"))
<0 rows> (or 0-length row.names)

но каждый из них работает индивидуально:

> subset(tt, customer_id==177)

> subset(tt, visit_date=="2010-08-26")

(Хотите избежать использования больших временных переменных - мой набор данных огромен)

Ответ 1

На странице справки для Logical Operators, доступной с помощью ?"&&":

& и && указать логические И и | и || указать логическое ИЛИ. Более короткая форма выполняет элементарные сравнения во многом аналогично арифметическим операторам. Более длинная форма оценивает слева направо, исследуя только первый элемент каждого вектора. Оценка продолжается только до тех пор, пока не будет определен результат. Более длинная форма подходит для программирования потока управления и, как правило, предпочтительнее в разделах if.

(версия R 2.13-0)

Другими словами, при использовании subset используйте одиночный &.


Вот иллюстрация разницы:

c(1,1,0,0) & c(1,0,1,0)
[1]  TRUE FALSE FALSE FALSE

c(1,1,0,0) && c(1,0,1,0)
[1] TRUE

Если это выглядит странно по сравнению с другими парадигмами программирования, помните, что R должен обеспечить векторную форму оператора.

Ответ 2

В R вы действительно хотите, чтобы оператор &, а не && выполнял парную операцию И, && выполняет побитовое И. Это же правило применяется для OR: если вы хотите сделать логическое ИЛИ, а не побитовое ИЛИ, вам нужен оператор |.