Gemäß der R-Sprachdefinition besteht der Unterschied zwischen &
und &&
(entsprechend |
und ||
) darin, dass ersteres vektorisiert wird, während letzteres nicht.
Nach dem Hilfetext las ich den Unterschied verwandt mit dem Unterschied zwischen einem „Und“ und „AndAlso“ (entsprechend „Oder“ und „OrElse“) ... Bedeutung: Das nicht alle Auswertungen , wenn sie müssen nicht sein (dh A oder B oder C ist immer wahr, wenn A wahr ist, also hören Sie auf zu bewerten, ob A wahr ist)
Könnte hier jemand Licht ins Dunkel bringen? Gibt es auch ein AndAlso und OrElse in R?
Antworten:
Die kürzeren sind vektorisiert, was bedeutet, dass sie einen Vektor wie folgt zurückgeben können:
Die längere Form wertet von links nach rechts aus und untersucht nur das erste Element jedes Vektors
Wie auf der Hilfeseite angegeben, ist die längere Form "für die Programmierung des Kontrollflusses geeignet und wird in if-Klauseln normalerweise bevorzugt".
Sie möchten die langen Formen also 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, z. B. 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 von> 1 haben. Wenn Sie sich also nicht ganz sicher sind, sollten Sie entweder zuerst prüfen oder die Kurzform verwenden und sie dann verwenden
all
undany
auf Länge eins reduzieren, um sie in Kontrollflussanweisungen wie zif
.Die Funktionen
all
undany
werden häufig für das Ergebnis eines vektorisierten Vergleichs verwendet, um festzustellen, ob alle oder einige der Vergleiche wahr sind. Die Ergebnisse dieser Funktionen haben mit Sicherheit die Länge 1, sodass sie für die Verwendung in if-Klauseln geeignet sind, die Ergebnisse des vektorisierten Vergleichs jedoch nicht. (Obwohl diese Ergebnisse für die Verwendung in geeignet wärenifelse
.Ein letzter Unterschied: Die
&&
und||
bewerten nur so viele Begriffe, wie sie benötigen (was mit Kurzschluss gemeint zu sein scheint). Hier ist zum Beispiel ein Vergleich mit einem undefinierten Werta
. wenn es nicht Kurzschluss hat, wie&
und|
dies nicht tun, würde es einen Fehler geben.Siehe schließlich Abschnitt 8.2.17 in The R Inferno mit dem Titel "and and andand".
quelle
c(TRUE, FALSE)
, und dieif
Aussage wäre nicht klar. Wenn Sie sicher sind, dass alles die Länge 1 hat, dann reicht beides, und Sie haben Recht, dass der "Kurzschluss" der Grund ist, einen zu bevorzugen. Ein Wort der Warnung: Stellen Sie sicher, dass Sie zu 100% sicher sind, dass sie nur die Länge eins haben können. Sie können sonst wirklich doofe Fehler bekommen.?is.R
, ob Sie R oder S-Plus ausführen.if(exists("is.R") && is.function(is.R) && is.R())
. Wennis.R
nicht vorhanden, möchten Sie nicht auswerten,is.function(is.R)
da dies einen Fehler auslöst. Wenn Sieis.R
keine Funktion haben, möchten Sie sie auch nicht so aufrufen, als ob sie es wäre.Die Antwort zum Thema "Kurzschluss" ist möglicherweise irreführend, hat aber eine gewisse Wahrheit (siehe unten). In der R / S-Sprache
&&
und||
nur das erste Element im ersten Argument auswerten. Alle anderen Elemente in einem Vektor oder einer Liste werden unabhängig vom ersten Wert ignoriert. Diese Operatoren sind so konzipiert, dass sie mit derif (cond) {} else{}
Konstruktion arbeiten und die Programmsteuerung steuern, anstatt neue Vektoren zu erstellen . Die&
und die|
Operatoren sind so konzipiert, dass sie an Vektoren arbeiten, sodass sie sozusagen "parallel" entlang der Länge von angewendet werden das längste Argument. Beide Vektoren müssen ausgewertet werden, bevor die Vergleiche durchgeführt werden. Wenn die Vektoren nicht gleich lang sind, wird das kürzere Argument recycelt.Wenn die Argumente zu
&&
oder||
ausgewertet werden, gibt es einen "Kurzschluss", da, wenn einer der Werte nacheinander von links nach rechts bestimmend ist, die Auswertungen aufhören und der Endwert zurückgegeben wird.Der Vorteil des Kurzschlusses tritt nur auf, wenn die Bewertung der Argumente lange dauert. Dies tritt normalerweise auf, wenn die Argumente Funktionen sind, die entweder größere Objekte verarbeiten oder mathematische Operationen haben, die komplexer sind.
quelle
&&
und sagen||
.&&
Funktionen sind und das erste falsch ist, das zweite nicht ausgewertet wird. Das ist nicht wahr für entweder&
oderifelse
die beiden Argumente bewerten.&&
und||
sind das, was man "Kurzschluss" nennt. Das bedeutet, dass sie den zweiten Operanden nicht auswerten, wenn der erste Operand ausreicht, um den Wert des Ausdrucks zu bestimmen.Wenn beispielsweise der erste Operand to
&&
falsch ist, macht es keinen Sinn, den zweiten Operanden auszuwerten, da er den Wert des Ausdrucks nicht ändern kann (false && true
undfalse && false
beide falsch sind). Gleiches gilt,||
wenn der erste Operand wahr ist.Weitere Informationen hierzu finden Sie hier: http://en.wikipedia.org/wiki/Short-circuit_evaluation Aus der Tabelle auf dieser Seite können Sie ersehen, dass
&&
diesAndAlso
VB.NET entspricht, auf das Sie sich vermutlich beziehen.quelle
f <- function() { print('hello'); TRUE }; FALSE && f()
. Wechseln Sie zu&
und beachten Sie, dass die Funktion ausgewertet wird. QED.&&
und||
kurzgeschlossen. Aber das ist wirklich ein ziemlich kleiner Punkt bei Vergleichen zwischen der Kurzform und der Langform; Es ist viel wichtiger zu verstehen, was jeder tut, wenn die Eingaben Vektoren sind.F & {message("Boo!");T}
undF && {message("Boo!");T}
.