Более короткие из них векторизованы, что означает, что они могут возвращать вектор, например так:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
Более длинная форма оценивает слева направо, рассматривая только первый элемент каждого вектора, поэтому приведенное выше дает
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Как говорится на странице справки, это делает более длинную форму "подходящей для программирования потока управления и обычно предпочтительной в выражениях if."
Таким образом, вы хотите использовать длинные формытолько когда вы уверены, что векторы имеют длину один.
Вы должны быть абсолютно , определенные ваши векторы имеют только длину 1, например, в случаях, когда они являются функциями, которые возвращают только логические значения длины 1.Вы хотите использовать короткие формы, если векторы имеют длину, возможно,> 1.Так что, если вы не совсем уверены, вам следует сначала проверить или использовать краткую форму, а затем использовать all
и any
, чтобы уменьшить ее до длины для использования в операторах потока управления, например if
.
Функции all
и any
часто используются в результате векторизованного сравнения, чтобы увидеть, являются ли все или какие-либо из сравнений истинными, соответственно.Результаты этих функций обязательно имеют длину 1, поэтому они подходят для использования в предложениях if, а результаты векторизованного сравнения - нет.(Хотя эти результаты были бы подходящими для использования в ifelse
.
Одно заключительное отличие: &&
и ||
оценивают только столько терминов, сколько им нужно (что, по-видимому, означаеткороткое замыкание). Например, вот сравнение с использованием неопределенного значения a
; если бы оно не было коротким замыканием, как &
и |
, это выдает ошибку.
a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found
Наконец, см. Раздел 8.2.17 в R Inferno , озаглавленный «и и and and».