web-dev-qa-db-fra.com

Opérateurs booléens && et ||

Selon le définition du langage R , la différence entre & et && (de manière correspondante | et ||) est que le premier est vectorisé alors que le ce dernier n'est pas.

Selon le texte d'aide , je lis la différence qui ressemble à la différence entre un "Et" et un "AndAlso" (correspondant à "Ou" et "OrElse") ... Signification: Ce ne sont pas toutes les évaluations si ils ne doivent pas nécessairement l'être (c'est-à-dire que A ou B ou C est toujours vrai si A est vrai, alors arrêtez d'évaluer si A est vrai)

Quelqu'un pourrait-il faire la lumière ici? Aussi, y a-t-il un AndAlso et OrElse dans R?

223
SFun28

Les plus courtes sont vectorisées, ce qui signifie qu'elles peuvent renvoyer un vecteur, comme ceci:

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

La forme la plus longue est évaluée de gauche à droite en examinant uniquement le premier élément de chaque vecteur.

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

Comme le dit la page d’aide, la forme la plus longue est "appropriée pour la programmation du contrôle-flux et [est] généralement préférée dans les clauses if".

Vous souhaitez donc utiliser les formes longues uniquement lorsque vous êtes certain que les vecteurs ont la longueur 1.

Vous devez être absolument certains de vos vecteurs ne sont que de longueur 1, comme dans le cas où ce sont des fonctions qui ne renvoient que des booléens de longueur 1. Vous souhaitez utiliser les formes abrégées si la longueur des vecteurs est éventuellement> 1. Donc, si vous n'êtes pas absolument sûr, vous devriez d'abord vérifier, ou utiliser la forme abrégée, puis utiliser all et any pour le réduire à la longueur 1, afin de l'utiliser dans les instructions de flux de contrôle, comme if.

Les fonctions all et any sont souvent utilisées sur le résultat d'une comparaison vectorisée pour voir si toutes ou toutes les comparaisons sont vraies, respectivement. Les résultats de ces fonctions sont assurément de longueur 1 et conviennent donc pour une utilisation dans des clauses if, alors que les résultats de la comparaison vectorisée ne le sont pas. (Bien que ces résultats soient appropriés pour une utilisation dans ifelse.

Une dernière différence: les && et || évaluent uniquement le nombre de termes dont ils ont besoin (ce qui semble être ce que l’on entend par court-circuit). Par exemple, voici une comparaison utilisant une valeur non définie a; si elle ne court-circuite pas, comme & et | ne le font pas, cela donnerait 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 The R Inferno , intitulée "and and andand".

311
Aaron

La réponse à propos de "court-circuit" est potentiellement trompeuse, mais a une vérité (voir ci-dessous). Dans le langage R/S, && et || évaluent uniquement le premier élément du premier argument. Tous les autres éléments d'un vecteur ou d'une liste sont ignorés quelle que soit la première valeur. Ces opérateurs sont conçus pour fonctionner avec la construction if (cond) {} else{} et pour diriger le contrôle du programme plutôt que pour construire de nouveaux vecteurs. Les opérateurs & et | sont conçus pour travailler sur des vecteurs. être appliqué "en parallèle", pour ainsi dire, le long du plus long argument. Si les vecteurs n'ont pas la même longueur, le recyclage de l'argument le plus court est alors effectué.

Lorsque les arguments de && ou || sont évalués, il y a "court-circuit" en ce que si l'une des valeurs successives de gauche à droite est déterminante, les évaluations cessent et la valeur finale est renvoyée. .

> 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
30
42-

&& et || sont ce qu'on appelle un "court-circuit". Cela signifie qu'ils n'évalueront pas le deuxième opérande si le premier est suffisant pour déterminer la valeur de l'expression.

Par exemple, si le premier opérande de && est faux, l'évaluation du deuxième opérande est inutile, car il ne peut pas changer la valeur de l'expression (false && true et false && false sont tous deux faux). Il en va de même pour || lorsque le premier opérande est vrai.

Vous pouvez en savoir plus à ce sujet ici: http://en.wikipedia.org/wiki/Short-circuit_evaluation Dans le tableau de cette page, vous pouvez voir que && est équivalent à AndAlso dans VB.NET, auquel je suppose que vous faites référence.

21
Theo