Більш короткі - векторизовані, тобто вони можуть повернути вектор, наприклад:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
Чим довша форма оцінюється зліва направо, вивчаючи лише перший елемент кожного вектора, тому наведене вище дає
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Як зазначається на сторінці довідки, це робить більш довгу форму, "підходящу для програмування потоку управління, і [є], як правило, бажано в пунктах, якщо передбачено".
Таким чином, ви хочете використовувати довгі форми лише тоді, коли ви впевнені, що вектори - це одна довжина.
Ви повинні бути абсолютно впевнені, що ваші вектори мають довжину лише 1, як, наприклад, у випадках, коли вони є функціями, що повертають буліни лише довжиною 1. Ви хочете використовувати короткі форми, якщо довжина векторів можливо> 1. Отже, якщо ви не зовсім впевнені, вам слід спочатку перевірити або скористатися короткою формою, а потім використовувати all
та any
зменшити її до однієї довжини для використання в операторах управління потоком, наприклад if
.
Функції all
і any
часто використовуються за результатами векторизованого порівняння, щоб побачити, чи справді все чи будь-яке порівняння. Результати цих функцій, безумовно, будуть довжиною 1, тому вони є придатними для використання, якщо пункти, тоді як результати векторизованого порівняння не є. (Хоча ці результати були б доречними для використання в 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 у " The R Inferno " під назвою "і та і".