Menu

Les opérateurs en R : arithmétiques, de comparaison, logiques, %in% et %%

Tous les opérateurs dont tu as besoin en R - l'arithmétique dont %% et %/%, les comparaisons vectorisées, la distinction & / &&, et %in% pour tester l'appartenance.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Les opérateurs que R te donne

Les opérateurs de R se répartissent en quatre groupes de travail : arithmétiques (+ - * / ^ %% %/%), de comparaison (== != < <= > >=), logiques (& | && || ! xor), et le test d'appartenance %in%. Deux choses les distinguent de la plupart des langages : presque tous sont vectorisés - ils opèrent sur des vecteurs entiers d'un coup, élément par élément - et R a deux opérateurs ET et deux opérateurs OU qui ne sont pas interchangeables. Cette page les couvre tous, plus les pièges de priorité qui produisent des réponses silencieusement fausses.

Arithmétique : +, -, *, /, ^, %% et %/%

Les cinq premiers font ce que tu attends. Les deux entourés de pourcents - %% (modulo, le reste) et %/% (division entière, le quotient) - sont ceux que les gens cherchent :

Note que / fait toujours une division en virgule flottante - 17 / 5 vaut 3.4, jamais 3. Si tu veux la partie entière, c'est exactement le rôle de %/%.

Le travail quotidien de %%, c'est la divisibilité. Un nombre est pair quand la division par 2 ne laisse pas de reste :

Cette seconde ligne mérite une pause : avec un opérande négatif, le %% de R renvoie un résultat portant le signe du diviseur (-7 %% 3 vaut 2, parce que -7 = -3 * 3 + 2). Certains langages font l'inverse ; si tu portes du code, vérifie.

Les opérateurs de comparaison sont vectorisés

==, !=, <, <=, >, >= comparent élément par élément et renvoient un vecteur logique, pas une réponse unique :

C'est le moteur de presque tout le filtrage en R - tu compares un vecteur entier à une valeur, tu obtiens un masque logique, et tu utilises le masque pour extraire. Une mise en garde avec == sur les décimaux : les nombres en virgule flottante sont stockés de façon approchée, donc 0.1 + 0.2 == 0.3 vaut FALSE. Pour les comparaisons décimales, préfère all.equal() ou vérifie abs(x - y) < 1e-9.

Opérateurs logiques : & ou && (la confusion classique)

R a deux opérateurs ET et deux opérateurs OU, et choisir le mauvais est un rite de passage.

& et | sont vectorisés. Ils combinent deux vecteurs logiques élément par élément :

Utilise-les dès que tu construis un filtre sur des données : df[df$age > 30 & df$city == "Lisbon", ].

&& et || sont scalaires et court-circuitent. Ils prennent des valeurs uniques, renvoient un seul TRUE/FALSE, et sautent entièrement le second opérande si le premier tranche déjà la réponse :

Cette seconde ligne illustre le court-circuit : comme x < 0 vaut FALSE, R n'évalue jamais l'appel à stop(). C'est exactement pourquoi && a sa place dans les conditions if() - tu peux écrire if (!is.na(x) && x > 10) et la partie x > 10 est sautée sans risque quand x vaut NA.

La règle empirique : &/| pour les vecteurs et le filtrage de données, &&/|| pour les conditions if(). Et depuis R 4.3, c'est appliqué fermement : donner à && ou || un vecteur de longueur supérieure à 1 est une erreur (les anciennes versions de R n'utilisaient silencieusement que le premier élément, ce qui a masqué de vrais bugs pendant des années).

xor(a, b) complète l'ensemble - TRUE quand exactement l'un des deux est TRUE :

%in% : tester l'appartenance

x %in% table demande, pour chaque élément de x, « celui-ci apparaît-il quelque part dans table ? ». C'est l'un des opérateurs les plus utilisés dans du vrai code R :

Le côté testé peut être un vecteur entier, ce qui fait de %in% l'outil naturel pour filtrer des lignes selon un ensemble de valeurs autorisées.

Il bat aussi l'alternative que tu écrirais sinon - une chaîne de == collés avec des | :

Avec cinq valeurs autorisées, la chaîne de == devient un mur de répétitions ; la version %in% se contente d'allonger le vecteur. Il y a un second avantage, plus subtil - %in% ne renvoie jamais NA :

NA == 1 vaut NA parce que R ne peut pas savoir si une valeur inconnue est égale à 1 - un comportement traité en profondeur dans les valeurs manquantes. Ce NA empoisonne ensuite tout if() qu'il atteint. %in% contourne tout le problème en répondant toujours TRUE ou FALSE, ce qui en fait le choix le plus sûr pour des conditions sur des données potentiellement manquantes.

Pièges de priorité

Deux pièges de priorité des opérateurs expliquent une part disproportionnée des moments « R est cassé ». D'abord, ^ a une priorité plus forte que le moins unaire :

Ensuite, le deux-points a une priorité plus forte que l'arithmétique binaire :

Dans le doute, ajoute des parenthèses. Elles ne coûtent rien et chaque lecteur (y compris toi dans le futur) les interprète comme l'interpréteur.

$ et [ ] : les opérateurs d'accès

Tu verras aussi constamment $, [ ] et [[ ]] - techniquement des opérateurs eux aussi, utilisés pour extraire des valeurs de structures plutôt que pour calculer :

Ils sont traités en détail dans les pages sur les vecteurs, les listes et les data frames - ici il suffit de les reconnaître comme membres de la même famille d'opérateurs.

Ce que tu retiens

  • %% donne le reste, %/% le quotient entier ; x %% 2 == 0 teste la parité.
  • Les comparaisons sont vectorisées - elles renvoient un vecteur logique avec lequel tu peux filtrer.
  • &/| combinent des vecteurs élément par élément ; &&/|| sont pour les valeurs uniques dans if() et court-circuitent. Depuis R 4.3, && sur un vecteur plus long est une erreur.
  • x %in% table remplace les == enchaînés et ne renvoie jamais NA.
  • -2^2 vaut -4 et 1:n - 1 commence à 0 - mets des parenthèses dans le doute.

Prochaine étape : mettre ces opérateurs au travail dans if, else et ifelse() - les instructions conditionnelles de R.

Questions fréquentes

Que fait %% en R ?

%% est l'opérateur modulo - il renvoie le reste d'une division. 17 %% 5 vaut 2. Son compagnon %/% fait la division entière et renvoie le quotient sans le reste : 17 %/% 5 vaut 3. L'usage classique de %% est le test de parité : x %% 2 == 0.

Quelle est la différence entre & et && en R ?

& est vectorisé : il compare deux vecteurs élément par élément et renvoie un vecteur de même longueur. && ne travaille que sur des valeurs uniques, court-circuite (il saute le second opérande si le premier décide déjà du résultat) et renvoie exactement un TRUE ou un FALSE. Utilise & pour filtrer des vecteurs, && dans les conditions if(). Depuis R 4.3, donner à && ou || un vecteur de longueur supérieure à 1 est une erreur, pas un avertissement.

Que fait %in% en R ?

x %in% table teste si chaque élément de x apparaît quelque part dans table, en renvoyant TRUE ou FALSE par élément. "mango" %in% basket remplace une chaîne de comparaisons == reliées par |, et contrairement à == il ne renvoie jamais NA - une valeur manquante du côté testé donne simplement FALSE.

Pourquoi -2^2 renvoie-t-il -4 en R ?

Parce que ^ a une priorité plus forte que le moins unaire, R lit -2^2 comme -(2^2), soit -4. Si tu veux le carré de moins deux, écris (-2)^2, qui vaut 4. Le deux-points a un piège similaire : 1:n - 1 signifie (1:n) - 1, pas 1:(n - 1).

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER