Les plus courts sont vectorisés, ce qui signifie qu'ils peuvent renvoyer un vecteur, comme ceci:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
Le formulaire plus long évalue de gauche à droite en examinant uniquement le premier élément de chaque vecteur, donc ce qui précède donne
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Comme l'indique la page d'aide, cela rend le formulaire plus long "approprié pour la programmation du flux de contrôle et [est] généralement préféré dans les clauses if".
Vous souhaitez donc utiliser les formes longues uniquement lorsque vous êtes certain que les vecteurs sont de longueur un.
Vous devez être absolument certain que vos vecteurs ne sont que de longueur 1, comme dans le cas où ce sont des fonctions qui ne renvoient que des booléens de longueur 1. Vous souhaitez utiliser les formes courtes si les vecteurs sont de longueur éventuellement> 1. Donc, si vous n'êtes pas absolument sûr, vous devez d'abord vérifier, ou utiliser le formulaire court, puis utiliser all
et any
pour le réduire à une longueur pour une utilisation dans les instructions de flux de contrôle, comme if
.
Les fonctions all
et any
sont souvent utilisées sur le résultat d'une comparaison vectorisée pour voir si toutes ou certaines des comparaisons sont vraies, respectivement. Les résultats de ces fonctions sont sûrs de longueur 1, ils peuvent donc être utilisés dans les clauses if, tandis que les résultats de la comparaison vectorisée ne le sont pas. (Bien que ces résultats puissent être utilisés dans ifelse
.
Une dernière différence: le &&
et ||
n'évalue que le nombre de termes nécessaires (ce qui semble être ce que l'on entend par court-circuit). Par exemple, voici une comparaison utilisant une valeur non définie a
; s'il ne court-circuitait pas, comme &
et |
pas, cela donnerait une erreur.
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
Enfin, voir la section 8.2.17 dans The R Inferno , intitulée "and and and and".