Quelli più corti sono vettorizzati, nel senso che possono restituire un vettore, in questo modo:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
La forma più lunga valuta da sinistra a destra esaminando solo il primo elemento di ciascun vettore, quindi dà quanto sopra
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Come dice la pagina di aiuto, questo rende la forma più lunga "appropriata per la programmazione del flusso di controllo e [è] generalmente preferita nelle clausole if".
Quindi vuoi usare le forme lunghe solo quando sei sicuro che i vettori siano lunghi uno.
Dovresti essere assolutamente certo che i tuoi vettori siano solo di lunghezza 1, ad esempio nei casi in cui sono funzioni che restituiscono solo booleani di lunghezza 1. Si desidera utilizzare le forme brevi se i vettori hanno una lunghezza possibilmente> 1. Quindi, se non sei assolutamente sicuro, dovresti prima controllare, o usare la forma abbreviata e poi usare all
e any
per ridurla a lunghezza per usarla nelle istruzioni del flusso di controllo, come if
.
Le funzioni all
e any
vengono spesso utilizzate sul risultato di un confronto vettoriale per vedere se tutti o alcuni dei confronti sono veri, rispettivamente. I risultati di queste funzioni saranno sicuramente di lunghezza 1, quindi sono appropriati per l'uso nelle clausole if, mentre i risultati del confronto vettoriale non lo sono. (Anche se questi risultati sarebbero appropriati per l'uso in ifelse
.
Un'ultima differenza: l' unico &&
e ||
valutare tutti i termini di cui hanno bisogno (che sembra essere ciò che si intende per cortocircuito). Ad esempio, ecco un confronto usando un valore indefinito a
; se non cortocircuita, come &
e |
no, darebbe un errore.
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
Infine, vedi la sezione 8.2.17 in The R Inferno , intitolata "and and andand".