R gotcha: оператор логического и для объединения условий - & not && - PullRequest
21 голосов
/ 04 августа 2011

Почему 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")

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

Ответы [ 2 ]

26 голосов
/ 04 августа 2011

На странице справки для 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 должен предоставить векторизованную форму оператора.

8 голосов
/ 04 августа 2011

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

...