Булевы операторы && и ||
по словам определение языка R, разница между & и && (соответственно | и ||) заключается в том, что первый векторизован, а второй-нет.
по данным текст справки, Я прочитал разницу, сродни разнице между "И" и "AndAlso" (соответственно "или" и "OrElse")...
Значение:
Что не все оценки, если они не должны быть (т. е. A или B или C всегда истинно, если a истинно, так прекратить вычисления, если это правда)
может кто-нибудь пролить свет здесь?
Кроме того, есть ли AndAlso и OrElse в R?
3 ответов:
более короткие векторизованы, то есть они могут возвращать вектор, например:
((-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 в The R Inferno, под названием "and and andand".
ответ про "короткое замыкание" потенциально вводит в заблуждение, но есть доля правды (см. ниже). На языке R / S,
&&и||только вычислить первый элемент в первом аргументе. Все остальные элементы в векторе или списке игнорируются независимо от первого значения. Эти операторы предназначены для работы сif (cond) {} else{}построение и прямое управление программой, а не построение новых векторов.. Элемент&и|операторы предназначены для работаем над векторами, поэтому они будут применяться "параллельно", так сказать, по длине самого длинного аргумента. Если векторы не имеют одинаковой длины, то выполняется повторное использование более короткого аргумента.когда аргументы
&&или||оцениваются, происходит "короткое замыкание" в том, что если какое-либо из значений подряд слева направо является определяющим, то оценки прекращаются и возвращается конечное значение.> if( print(1) ) {print(2)} else {print(3)} [1] 1 [1] 2 > if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated [1] 3 > if(TRUE && print(1) ) {print(2)} else {print(3)} [1] 1 [1] 2 > if(TRUE && !print(1) ) {print(2)} else {print(3)} [1] 1 [1] 3 > if(FALSE && !print(1) ) {print(2)} else {print(3)} [1] 3
&&и||это то, что называется "короткое замыкание". Это означает, что они не будут оценивать второй операнд, если первого операнда достаточно для определения значения выражения.например, если первый операнд
&&false тогда нет смысла вычислять второй операнд, так как он не может изменить значение выражения (false && trueиfalse && falseявляются ложными). То же самое касается||когда первый операнд истинный.вы можете прочитать больше об этом здесь: http://en.wikipedia.org/wiki/Short-circuit_evaluation из таблицы на этой странице вы можете видеть что
&&эквивалентноAndAlsoin VB.NET и я полагаю, что вы имеете в виду.
Comments