328 votes

R - booléennes opérateurs && et ||

Selon les R du langage de définition de la différence entre & et && (de même | et ||) est que le premier est vectorisé tandis que le plus tard ne l'est pas.

Selon ce site: http://www.stat.psu.edu/~dhunter/R/html/base/html/Logic.html J'ai lu la différence apparente à la différence entre "Et" et "AndAlso" (de même "Ou" et "OrElse")...ce qui signifie que pas toutes les évaluations si ils n'ont pas à être (c'est à dire A, B ou C est toujours vrai si A est vrai, alors arrêtez d'évaluer si A est vrai)

Quelqu'un pourrait jeter de la lumière ici? Aussi, est-il un AndAlso et OrElse dans R?

440voto

Aaron Points 15093

Les plus courts sont vectorisées, ce qui signifie qu'ils peuvent retourner un vecteur, comme ceci:

> ((-2:2) >= 0) & ((-2:2) <= 0)
[1] FALSE FALSE  TRUE FALSE FALSE

La forme longue évalue la gauche vers la droite de l'examen uniquement le premier élément de chaque vecteur, de sorte que la donne

> ((-2:2) >= 0) && ((-2:2) <= 0)
[1] FALSE

Que la page d'aide dit, ce qui rend le plus "approprié pour la programmation, le contrôle de flux et [est] généralement privilégiées dans la si les clauses."

Si vous souhaitez utiliser les formulaires longs seulement quand vous êtes certains que les vecteurs sont de longueur.

Vous devez être absolument certain que votre vecteurs ne sont de longueur 1, comme dans les cas où ils sont les fonctions qui retournent seulement d'une longueur de 1 booléens. Vous souhaitez utiliser les formes courtes si les vecteurs sont de longueur éventuellement >1. Donc, si vous n'êtes pas absolument sûr, vous devez vérifier d'abord, ou utiliser le formulaire court et ensuite utiliser all et any de le réduire à longueur pour une utilisation dans les instructions de flux de contrôle, comme if.

Les fonctions all et any sont souvent utilisés sur le résultat d'un vectorisé comparaison pour voir si l'une ou toutes les comparaisons sont remplies, respectivement. Les résultats de ces fonctions sont sûr d'être d'une longueur de 1 de sorte qu'ils sont appropriés pour une utilisation dans si les clauses, tandis que les résultats de la vectorisé comparaison ne sont pas. (Bien que ces résultats seraient appropriés pour une utilisation en ifelse.

Une dernière différence: l' && et || seulement d'évaluer le nombre de termes dont ils ont besoin pour (ce qui semble être ce que l'on entend par court-circuit). Par exemple, voici une comparaison à l'aide d'une valeur indéfinie a; si elle n'a pas de court-circuit, & et | ne pas, il serait une erreur.

> 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

Enfin, voir la section 8.2.17 dans La R Inferno, intitulée "et et andand".

49voto

BondedDust Points 105234

La réponse à propos de "court-circuit" est potentiellement trompeuses, mais a une part de vérité (voir ci-dessous). Dans le R/S de la langue, && et || seulement d'évaluer le premier élément dans le premier argument. Tous les autres si l'argument est un vecteur sont ignorés quel que soit le premier de la valeur. Ils sont conçus pour fonctionner avec l' if (cond) {} else{} de la construction. L' & et de la | des opérateurs sont conçus pour fonctionner sur des vecteurs, de sorte qu'ils seront appliquées "en parallèle" pour ainsi dire le long de la longueur de la plus longue argument. Si les vecteurs ne sont pas de la même longueur, alors le recyclage de la court d'argument est effectuée.

Lorsque les arguments d' && ou || sont des fonctions, il est "court-circuit" dans le sens que si l'une des valeurs de la succession de gauche à droite, sont déterminants, alors les évaluations de cesser et de la valeur finale est retourné.

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)}
[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

32voto

Theo Points 60103

&& et || sont ce qu'on appelle le "court-circuit". Cela signifie qu'ils ne seront pas évaluer le second opérande si le premier opérande est suffisant pour déterminer la valeur de l'expression.

Par exemple, si le premier opérande d' && est fausse, alors il n'y a pas de point dans l'évaluation de la deuxième opérande, car il ne peut pas changer la valeur de l'expression (false && true et false && false sont faux). Il en va de même pour l' || lors de la première opérande est vrai.

Vous pouvez en lire plus à ce sujet ici: http://en.wikipedia.org/wiki/Short-circuit_evaluation à Partir de la table sur cette page, vous pouvez voir qu' && est équivalent à AndAlso dans VB.NET qui je suppose que vous faites allusion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X