Les nombres et les vecteurs

Informatique — R, chapitre 1

Chaque encadré ci-dessous est une console. Modifiez le code, cliquez sur Exécuter, lisez le résultat. Le tout premier lancement demande une quinzaine de secondes, le temps que R arrive dans votre navigateur.

1.1 Ranger une valeur dans une variable

1.1.1 Le principe

x <- 5 x

Deux choses à remarquer.

L’affectation s’écrit <-, une flèche vers la gauche : range 5 dans x. Le signe = fonctionne aussi, mais la flèche reste la convention, et elle a le mérite d’indiquer le sens.

R affiche sans qu’on le lui demande. Taper le nom d’une variable suffit à en voir le contenu — pas besoin d’un print.

NoteQue veut dire le [1] ?

R répond [1] 5. Ce [1] n’est pas une valeur : c’est le numéro du premier élément affiché sur la ligne. R considère que toute valeur est une suite, et 5 n’est qu’une suite d’un seul élément.

Cette idée gouverne tout le langage. Nous y revenons en 1.4.

1.1.2 Les règles à respecter

Un nom contient des lettres sans accent, des chiffres, le point et le tiret bas. Il ne peut pas commencer par un chiffre.

2x <- 5

Écrivez x2. Et sachez que le point est autorisé dans un nom : taux.moyen est valide en R, ce qui surprend quand on vient d’un autre langage.

1.1.3 Majuscules et minuscules

x <- 5 X

Error: object 'X' not found. Seul x existe.

1.2 Les quatre opérations

a <- 7 b <- 3 a + b # addition a - b # soustraction a * b # multiplication a / b # division

Le symbole # ouvre un commentaire, ignoré par R.

1.2.1 Division entière et reste

a <- 7 b <- 3 a %/% b # division entiere a %% b # reste

Les opérateurs encadrés de % sont une particularité de R. On en rencontrera d’autres.

AvertissementLa division par zéro ne s’arrête pas
7 / 0
0 / 0

R répond Inf, puis NaNNot a Number. Aucune erreur, aucun arrêt : le calcul continue avec ces valeurs, qui contaminent tout ce qui suit.

Essayez, puis calculez Inf - Inf. Vous obtiendrez encore NaN.

1.3 Puissances et fonctions

2^10 # puissance : l'accent circonflexe sqrt(16) # racine carree abs(-4) # valeur absolue exp(1) # exponentielle log(10) # logarithme naturel log10(10) # logarithme decimal round(pi, 3) # arrondi a trois decimales

Tout est disponible d’emblée : contrairement à Python, R n’exige aucun import pour les mathématiques usuelles.

Avertissementlog est le logarithme naturel

Comme dans presque tous les langages, log(x) désigne le logarithme de base e, pas celui de base 10. Pour le logarithme décimal, log10(x).

L’erreur est fréquente et silencieuse : les deux fonctions renvoient un nombre parfaitement plausible.

1.4 Le vecteur, cœur du langage

C’est ici que R se distingue.

1.4.1 Créer un vecteur

La fonction c — pour combine — assemble plusieurs valeurs en une seule.

v <- c(4, 8, 15, 16, 23, 42) v

1.4.2 L’opération s’applique à tout

v <- c(4, 8, 15, 16, 23, 42) v * 2 # chaque valeur est doublee v + 100 # chaque valeur est augmentee de 100 sqrt(v) # la racine de chacune

Une seule commande traite les six valeurs. C’est la vectorisation, et c’est le réflexe à acquérir en premier : si vous vous apprêtez à écrire une boucle en R, demandez-vous d’abord si l’opération ne s’applique pas directement au vecteur entier.

1.4.3 Créer des suites régulières

1:10 # de 1 a 10, pas de 1 seq(0, 1, by = 0.25) # de 0 a 1, pas de 0,25 rep(c(1, 2), times = 3) # repeter un motif

1.4.4 Combien de valeurs ?

v <- c(4, 8, 15, 16, 23, 42) length(v) # nombre d'elements sum(v) # somme mean(v) # moyenne

1.5 Extraire des valeurs

1.5.1 Par position

v <- c(4, 8, 15, 16, 23, 42) v[1] # le premier element v[3] # le troisieme v[c(1, 3)] # le premier et le troisieme v[-1] # tous SAUF le premier
AvertissementOn compte à partir de 1, et l’indice 0 ne dit rien

R numérote à partir de 1 : v[1] est bien la première valeur. C’est la même convention qu’en MATLAB, l’inverse de Python.

Mais v[0] ne provoque aucune erreur : R renvoie un vecteur vide, silencieusement. Une erreur franche vaudrait mieux qu’un silence — essayez, pour vous en souvenir.

1.5.2 Par condition

v <- c(4, 8, 15, 16, 23, 42) v > 15 # une reponse par element : VRAI ou FAUX v[v > 15] # on ne garde que les positions vraies sum(v > 15) # combien y en a-t-il

La condition v > 15 produit une suite de TRUE et FALSE. Les crochets ne retiennent que les positions vraies. Et sum les compte, puisqu’un TRUE vaut 1.

1.6 Un premier graphique

v <- c(4, 8, 15, 16, 23, 42) plot(v, type = "b", pch = 19, col = "#2f7ea8", lwd = 2, main = "Un premier graphique", xlab = "position", ylab = "valeur") grid()

Aucun réglage préalable, aucune bibliothèque : c’est l’un des grands conforts de R. Remplacez type = "b" par "l" pour une ligne seule, ou "h" pour des bâtons.

1.7 Deux surprises à connaître

1.7.1 Les nombres à virgule sont approchés

0.1 + 0.2 0.1 + 0.2 == 0.3 all.equal(0.1 + 0.2, 0.3)

La première ligne affiche 0.3, la deuxième répond FALSE. R arrondit l’affichage, mais la valeur exacte diffère légèrement de 0,3.

Important

Ne testez jamais l’égalité de deux nombres à virgule par ==. Utilisez all.equal, qui tolère un écart négligeable. Cela vaut dans tous les langages.

1.7.2 Les valeurs manquantes se propagent

w <- c(4, 8, NA, 16) mean(w) # NA : une valeur manquante suffit mean(w, na.rm = TRUE) # on demande de les ignorer

NANot Available — désigne une donnée absente. La moindre valeur manquante rend le résultat entier indisponible, ce qui est un choix délibéré : R refuse de calculer une moyenne en cachant qu’il manque des données. L’argument na.rm = TRUE lève l’objection en connaissance de cause.

À vous

Créez un vecteur u contenant 3, 7, 11, 15 et 19. Affichez sa longueur, sa somme, sa moyenne, ses éléments supérieurs à 10, et le vecteur multiplié par 3.

u <- c(3, 7, 11, 15, 19) # a completer
length(u)     # 5
sum(u)        # 55
mean(u)       # 11
u[u > 10]     # 11 15 19
u * 3         # 9 21 33 45 57

Aucune boucle nulle part. C’est tout l’esprit de R.

Ce qu’il faut retenir

Écriture Effet
x <- 5 ranger 5 dans x
# commentaire, ignoré
+ - * / les quatre opérations
%/% et %% division entière et reste
^ puissance
sqrt, exp, log, log10 disponibles sans rien charger
c(...) assembler un vecteur
1:10, seq, rep fabriquer une suite
length, sum, mean mesurer, additionner, moyenner
v[3], v[-1], v[v > 15] extraire par position ou par condition
plot tracer, sans configuration
NA, na.rm = TRUE valeur manquante, et comment l’ignorer

Le chapitre suivant présente les autres types de R : le texte, les valeurs logiques, et les facteurs — ces variables qualitatives qui n’existent nulle part ailleurs.