Более короткие из них векторизованы, что означает, что они могут возвращать вектор, например так:
((-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 andand».