Да, я знаю, было несколько вопросов (например, этот относительно использования &
vs. &&
в R, но я не нашел тот, который конкретно отвечает на мой вопрос.
Как я понимаю различия,
-
&
делает элементное, векторное сравнение, как и другие арифметические операции. Поэтому он возвращает логический вектор с длиной > 1, если оба аргумента имеют длину > 1. -
&&
сравнивает первые элементы обоих векторов и всегда возвращает результат длины 1. Кроме того, он выполняет короткое замыкание:cond1 && cond2 && cond3 && ...
оценивает толькоcond2
, еслиcond1
естьTRUE
и т.д., Это позволяет использовать такие вещи, какif(exists("is.R") && is.function(is.R) && is.R())
и, в частности, означает, что в некоторых случаях строго необходимо использовать&&
.
Кроме того, if
выдает предупреждение
условие имеет длину > 1, и будет использоваться только первый элемент
если его условие имеет более одного элемента.
Судя по этим предварительным комментариям, я бы счел более безопасным предпочесть &
- &&
во всех операторах if
, где короткое замыкание не требуется.
Если во время вычислений что-то пошло не так, и у меня случайно есть вектор в одном из аргументов &
, я получаю предупреждение, что хорошо. Если нет, все будет хорошо.
Если, с другой стороны, я использовал &&
, и в моих вычислениях что-то пошло не так, и один из аргументов &&
- это вектор, я не получаю предупреждение. Это плохо. Если по какой-то причине я действительно хочу сравнить первые элементы двух векторов, я бы сказал, что сделать это намного чище, чем явно, а не явно.
Обратите внимание, что это противоречит тому, что, по-видимому, является общим соглашением между программистами R и противоречит рекомендациям R docs. (1)
Следовательно, мой вопрос: Существуют ли какие-либо причины, кроме короткого замыкания, которые делают &&
предпочтительнее &
в выражениях if
?
(1) Цитирование help(&&)
:
'&' и '& &' указать логические И и '|' и '||' указывать логическое ИЛИ. Более короткая форма выполняет поэлементные сравнения в почти так же, как и арифметические операторы. Более длинная форма оценивает слева направо, исследуя только первый элемент каждого вектор. Оценка продолжается только до тех пор, пока не будет определен результат. Более длинная форма подходит для программирования потока управления и обычно предпочтительнее в предложениях "if".