Согласно определению языка R , различие между &
и &&
(соответственно |
и ||
) состоит в том, что первое векторизовано, а второе нет.
Согласно тексту справки , я прочел разницу, похожую на разницу между «И» и «AndAlso» (соответственно «И» и «OrElse») ... Значение: это не все оценки, если они не должны быть (то есть A или B или C всегда верны, если A истинно, поэтому прекратите оценку, если A истинно)
Может ли кто-то пролить свет здесь? Кроме того, есть AndAlso и OrElse в R?
Ответы:
Более короткие из них векторизованы, что означает, что они могут возвращать вектор, например так:
Более длинная форма оценивает слева направо, рассматривая только первый элемент каждого вектора, поэтому приведенное выше дает
Как говорится на странице справки, это делает более длинную форму «подходящей для программирования потока управления и обычно предпочтительной в выражениях if».
Таким образом, вы хотите использовать длинные формы только тогда, когда вы уверены, что векторы имеют длину один.
Вы должны быть абсолютно уверены, что ваши векторы имеют только длину 1, например, в случаях, когда они являются функциями, которые возвращают только логические значения длины 1. Вы хотите использовать короткие формы, если векторы имеют длину, возможно,> 1. Так что, если вы не совсем уверены, вы должны сначала проверить или использовать краткую форму, а затем использовать
all
иany
сократить ее до длины для использования в операторах потока управления, напримерif
.Функции
all
иany
часто используются в результате векторизованного сравнения, чтобы увидеть, являются ли все или какие-либо из сравнений истинными, соответственно. Результаты этих функций обязательно имеют длину 1, поэтому они подходят для использования в предложениях if, а результаты векторизованного сравнения - нет. (Хотя эти результаты будут подходящими для использования вifelse
.Одно заключительное отличие: «
&&
и»||
оценивают столько терминов, сколько им нужно (что, по-видимому, означает короткое замыкание). Например, вот сравнение с использованием неопределенного значенияa
; если бы оно не закорачивалось, как&
и|
нет, это дало бы ошибку.Наконец, см. Раздел 8.2.17 в R Inferno , озаглавленный «and and andand».
источник
c(TRUE, FALSE)
, иif
утверждение не будет ясным. Если вы уверены, что все имеет длину 1, тогда да, любой из них подойдет, и вы правы в том, что причиной является «короткое замыкание». Предупреждение, хотя, убедитесь, что вы на 100% уверены, что они могут быть только одного размера. В противном случае вы можете получить действительно глупые ошибки.?is.R
для проверки, используете ли вы R или S-Plus.if(exists("is.R") && is.function(is.R) && is.R())
, Еслиis.R
не существует, то вы не хотите оценивать,is.function(is.R)
поскольку он выдаст ошибку. Аналогично, еслиis.R
это не функция, вы не хотите вызывать ее так, как если бы она была.Ответ о «коротком замыкании» может ввести в заблуждение, но в нем есть доля правды (см. Ниже). На языке R / S
&&
и||
оценивать только первый элемент в первом аргументе. Все остальные элементы в векторе или списке игнорируются независимо от значения первых. Эти операторы предназначены для работы сif (cond) {} else{}
строительства и прямого программного управления , а не строить новые векторы ..&
и|
операторы предназначены для работы на векторах, поэтому они будут применяться «параллельно», так сказать, по длине самый длинный аргумент. Оба вектора должны быть оценены перед сравнением. Если векторы не имеют одинаковую длину, выполняется повторное использование более короткого аргумента.Когда аргументы для
&&
или||
оцениваются, возникает «короткое замыкание» в том, что если какое-либо из последовательных значений слева направо является определяющим, то оценки прекращаются и возвращается окончательное значение.Преимущество короткого замыкания проявляется только тогда, когда для оценки аргументов требуется много времени. Это обычно происходит, когда аргументы являются функциями, которые либо обрабатывают большие объекты, либо выполняют более сложные математические операции.
источник
&&
и||
.&&
являются функциями, а первый является ложным, то второй не будет оцениваться. Это не верно ни для одного,&
илиifelse
для оценки обоих аргументов.&&
и то||
, что называется "короткое замыкание" Это означает, что они не будут оценивать второй операнд, если первого операнда достаточно для определения значения выражения.Например, если первый операнд
&&
является ложным, тогда нет смысла оценивать второй операнд, поскольку он не может изменить значение выражения (false && true
иfalse && false
оба являются ложными). То же самое касается||
первого операнда.Вы можете прочитать больше об этом здесь: http://en.wikipedia.org/wiki/Short-circuit_evaluation Из таблицы на этой странице вы можете увидеть, что
&&
эквивалентноAndAlso
VB.NET, на который, я полагаю, вы ссылаетесь.источник
f <- function() { print('hello'); TRUE }; FALSE && f()
. Перейдите&
и обратите внимание, что функция оценивается. QED.&&
и||
короткое замыкание. Но это действительно довольно незначительный момент в сравнении между короткой формой и длинной формой; гораздо важнее понять, что каждый из них делает, когда входные данные являются векторами.F & {message("Boo!");T}
иF && {message("Boo!");T}
.