wake-up-neo.com

Boolesche Operatoren && und ||

Nach der R-Sprachdefinition ist der Unterschied zwischen & und && (entsprechend | und ||) ist, dass der erstere vektorisiert ist, während der letztere nicht.

Laut dem Hilfetext habe ich den Unterschied ähnlich dem Unterschied zwischen einem "Und" und "AndAlso" (entsprechend "Oder" und "OrElse") gelesen ... Bedeutung: Das sind nicht alle Auswertungen wenn sie müssen nicht sein (dh A oder B oder C ist immer wahr, wenn A wahr ist, also hör auf zu bewerten, ob A wahr ist)

Könnte hier jemand Licht ins Dunkel bringen? Gibt es auch ein AndAlso und ein OrElse in R?

223
SFun28

Die kürzeren sind vektorisiert, was bedeutet, dass sie einen Vektor wie folgt zurückgeben können:

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

Die längere Form wird von links nach rechts ausgewertet, wobei nur das erste Element jedes Vektors untersucht wird

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

Wie auf der Hilfeseite angegeben, ist die längere Form daher "für die Programmierung des Kontrollflusses geeignet und wird in if-Klauseln normalerweise bevorzugt".

Sie möchten also die langen Formen nur verwenden, wenn Sie sicher sind, dass die Vektoren die Länge eins haben.

Sie sollten absolut sicher sein, dass Ihre Vektoren nur die Länge 1 haben, beispielsweise in Fällen, in denen es sich um Funktionen handelt, die nur Boolesche Werte der Länge 1 zurückgeben. Sie möchten die Kurzformen verwenden, wenn die Vektoren möglicherweise eine Länge> 1 haben. Wenn Sie sich nicht ganz sicher sind, sollten Sie dies entweder zuerst überprüfen oder die Kurzform verwenden und dann all und any verwenden, um sie für die Verwendung in Steuerflussanweisungen wie z. B. auf die Länge 1 zu reduzieren if.

Die Funktionen all und any werden häufig für das Ergebnis eines vektorisierten Vergleichs verwendet, um festzustellen, ob alle oder einige der Vergleiche zutreffen. Die Ergebnisse dieser Funktionen haben mit Sicherheit die Länge 1, sodass sie für die Verwendung in if-Klauseln geeignet sind, die Ergebnisse aus dem vektorisierten Vergleich jedoch nicht. (Obwohl diese Ergebnisse für die Verwendung in ifelse geeignet wären.

Ein letzter Unterschied: der && und || werte nur so viele Begriffe aus, wie sie benötigen (was anscheinend mit Kurzschließen gemeint ist). Hier ist zum Beispiel ein Vergleich mit einem undefinierten Wert a; wenn es nicht kurzschließen würde, als & und | nicht, es würde einen Fehler geben.

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

Schließlich siehe Abschnitt 8.2.17 in The R Inferno mit dem Titel "and and andand".

311
Aaron

Die Antwort auf "Kurzschließen" ist möglicherweise irreführend, hat aber eine gewisse Wahrheit (siehe unten). In der R/S-Sprache werten && Und || Nur das erste Element im ersten Argument aus. Alle anderen Elemente in einem Vektor oder einer Liste werden unabhängig vom ersten Wert ignoriert. Diese Operatoren sind so konzipiert, dass sie mit der if (cond) {} else{} - Konstruktion arbeiten und die Programmsteuerung steuern, anstatt neue Vektoren zu konstruieren. Die Operatoren & Und | Sind so konzipiert, dass sie mit Vektoren arbeiten Sie werden also sozusagen "parallel" über die Länge des längsten Arguments angewendet. Wenn die Vektoren nicht die gleiche Länge haben, wird das kürzere Argument zurückgeführt.

Wenn die Argumente für && Oder || Ausgewertet werden, liegt ein "Kurzschluss" vor, da dann, wenn einer der aufeinanderfolgenden Werte von links nach rechts bestimmend ist, die Auswertungen aufhören und der endgültige Wert erhalten bleibt ist zurück gekommen.

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

&& und || sind so genannte "Kurzschlüsse". Das bedeutet, dass sie den zweiten Operanden nicht auswerten, wenn der erste Operand ausreicht, um den Wert des Ausdrucks zu bestimmen.

Zum Beispiel, wenn der erste Operand zu && ist falsch, dann macht es keinen Sinn, den zweiten Operanden auszuwerten, da er den Wert des Ausdrucks nicht ändern kann (false && true und false && false sind beide falsch). Das gleiche gilt für || wenn der erste Operand wahr ist.

Sie können hier mehr darüber lesen: http://en.wikipedia.org/wiki/Short-circuit_evaluation Aus der Tabelle auf dieser Seite können Sie das && entspricht AndAlso in VB.NET, auf das Sie sich vermutlich beziehen.

21
Theo