De acordo com a definição da linguagem R , a diferença entre &
e &&
(correspondentemente |
e ||
) é que o primeiro é vetorizado enquanto o último não.
De acordo com o texto de ajuda , li a diferença semelhante à diferença entre um "E" e "AndAlso" (correspondentemente "Or" e "OrElse") ... Significado: Que nem todas as avaliações, se não tiverem que ser (ou seja, A ou B ou C sempre é verdadeiro se A for verdadeiro, pare de avaliar se A é verdadeiro)
Alguém poderia lançar luz aqui? Além disso, existe um AndAlso e OrElse em R?
Respostas:
Os mais curtos são vetorizados, o que significa que eles podem retornar um vetor, assim:
A forma mais longa avalia da esquerda para a direita, examinando apenas o primeiro elemento de cada vetor;
Como a página de ajuda diz, isso torna a forma mais longa "apropriada para programar o fluxo de controle e [é] normalmente preferida nas cláusulas if".
Portanto, você deseja usar as formas longas apenas quando tiver certeza de que os vetores têm o comprimento um.
Você deve ter certeza absoluta de que seus vetores têm apenas o comprimento 1, como nos casos em que são funções que retornam apenas o comprimento 1 dos booleanos. Você deseja usar os formulários curtos se os vetores tiverem comprimento> possivelmente 1. Portanto, se você não tiver certeza absoluta, verifique primeiro ou use o formulário curto e, em seguida, use-o
all
eany
reduza-o ao comprimento um para uso em instruções de fluxo de controle, comoif
.As funções
all
eany
são frequentemente usadas no resultado de uma comparação vetorizada para verificar se todas ou quaisquer comparações são verdadeiras, respectivamente. Os resultados dessas funções certamente têm o comprimento 1, portanto são apropriados para uso nas cláusulas if, enquanto os resultados da comparação vetorizada não são. (Embora esses resultados sejam apropriados para uso noifelse
.Uma diferença final: o
&&
e||
avaliar apenas quantos termos forem necessários (o que parece ser o que se entende por curto-circuito). Por exemplo, aqui está uma comparação usando um valor indefinidoa
; se não curto-circuito, como&
e|
não, daria um erro.Por fim, consulte a seção 8.2.17 no The R Inferno , intitulada "and and andand".
fonte
c(TRUE, FALSE)
, e aif
declaração não seria clara. Se você tem certeza de que tudo tem o comprimento 1, então sim, qualquer um faria, e você está certo de que o "curto-circuito" é a razão para a sua preferência. Uma palavra de aviso, porém, verifique se você tem 100% de certeza de que eles podem ter apenas o comprimento um. Caso contrário, você pode obter bugs realmente patetas.?is.R
para verificar se você está executando o R ou S-Plus.if(exists("is.R") && is.function(is.R) && is.R())
. Seis.R
não existir, você não deseja avaliar,is.function(is.R)
pois isso gera um erro. Da mesma forma, seis.R
não for uma função, você não deseja chamá-la como se fosse.A resposta sobre "curto-circuito" é potencialmente enganosa, mas tem alguma verdade (veja abaixo). No R / S linguagem,
&&
e||
só avaliam o primeiro elemento no primeiro argumento. Todos os outros elementos em um vetor ou lista são ignorados, independentemente do valor inicial. Esses operadores são projetados para trabalhar com aif (cond) {} else{}
construção e para o controle do programa direta, em vez de construir novos vetores .. O&
e os|
operadores são projetados para trabalhar em vetores, então eles vão ser aplicadas "em paralelo", por assim dizer, ao longo do comprimento o argumento mais longo. Ambos os vetores precisam ser avaliados antes que as comparações sejam feitas. Se os vetores não tiverem o mesmo comprimento, será realizada a reciclagem do argumento mais curto.Quando os argumentos para
&&
ou||
são avaliados, há "curto-circuito", pois se algum dos valores sucessivos da esquerda para a direita for determinante, as avaliações cessarão e o valor final será retornado.A vantagem do curto-circuito só aparecerá quando os argumentos levarem muito tempo para serem avaliados. Isso geralmente ocorre quando os argumentos são funções que processam objetos maiores ou têm operações matemáticas mais complexas.
fonte
&&
e||
.&&
são funções e o primeiro for falso, o segundo não será avaliado. Isso não é verdade para um&
ou para oifelse
qual avaliará os dois argumentos.&&
e||
são o que é chamado de "curto-circuito". Isso significa que eles não avaliarão o segundo operando se o primeiro for suficiente para determinar o valor da expressão.Por exemplo, se o primeiro operando para
&&
for falso, não há sentido em avaliar o segundo operando, pois ele não pode alterar o valor da expressão (false && true
efalse && false
ambos são falsos). O mesmo vale para||
quando o primeiro operando for verdadeiro.Você pode ler mais sobre isso aqui: http://en.wikipedia.org/wiki/Short-circuit_evaluation Na tabela dessa página, você pode ver que isso
&&
é equivalente aoAndAlso
VB.NET, ao qual suponho que você esteja se referindo.fonte
f <- function() { print('hello'); TRUE }; FALSE && f()
. Mude para&
e observe que a função é avaliada. QED.&&
e está em||
curto-circuito. Mas esse é realmente um ponto bastante menor nas comparações entre a forma curta e a forma longa; é muito mais importante entender o que cada um faz quando as entradas são vetores.F & {message("Boo!");T}
eF && {message("Boo!");T}
.