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 wertet von links nach rechts aus und untersucht nur das erste Element jedes Vektors
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
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
und any
auf Länge eins reduzieren, um sie in Kontrollflussanweisungen wie z 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 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ären ifelse
.
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 Wert a
. wenn es nicht Kurzschluss hat, wie &
und |
dies nicht tun, würde es 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
Siehe schließlich Abschnitt 8.2.17 in The R Inferno mit dem Titel "and and andand".