Krótsze są wektoryzowane, co oznacza, że mogą zwrócić wektor w następujący sposób:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
Dłuższa forma ocenia od lewej do prawej, badając tylko pierwszy element każdego wektora, więc powyższe daje
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Jak mówi strona pomocy, powoduje to, że dłuższa forma jest „odpowiednia do programowania kontroli przepływu i zwykle jest preferowana w klauzulach if”.
Więc chcesz używać długich formularzy tylko wtedy, gdy masz pewność, że wektory mają długość jeden.
Powinieneś być absolutnie pewien, że twoje wektory mają tylko długość 1, na przykład w przypadkach, gdy są funkcjami, które zwracają tylko logiczne długości 1. Chcesz użyć krótkich formularzy, jeśli wektory mają długość prawdopodobnie> 1. Więc jeśli nie masz absolutnej pewności, powinieneś albo najpierw sprawdzić, albo użyć krótkiego formularza, a następnie użyć all
i any
zmniejszyć go do długości jednego do użycia w instrukcjach przepływu kontroli, takich jak if
.
Funkcje all
i any
są często używane w wyniku porównania wektorowego, aby sprawdzić, czy odpowiednio wszystkie lub jakiekolwiek porównania są prawdziwe. Wyniki tych funkcji z pewnością będą miały długość 1, więc są odpowiednie do użycia w klauzulach if, podczas gdy wyniki z wektoryzowanego porównania nie są. (Chociaż wyniki te byłyby odpowiednie do użycia w ifelse
.
Jedna końcowa różnica: &&
i ||
tylko oceniają tyle terminów, ile potrzebują (co wydaje się być tym, co rozumie się przez zwarcie). Na przykład, oto porównanie przy użyciu niezdefiniowanej wartości a
; jeśli nie spowoduje zwarcia, tak jak &
i |
nie, spowoduje błąd.
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
Na koniec zobacz sekcję 8.2.17 w R Inferno , zatytułowaną „oraz and and and”.