Bases de la programmation

Bienvenue

Bienvenue dans R

R est plus facile à utiliser lorsque vous avez bien compris comment fonctionne le langage R. L’objectif de ce module est de vous donnez les clefs de lecture et de compréhension pour interpréter et prévoir les résultats produits par l’exécution de lignes de code R. Vous découvrirez ainsi :

  • les fonctions et leurs arguments
  • les objets R
  • les types de données de base utilisés par R
  • les structures de données de base de R, notamment les vecteurs et les listes
  • le fonctionnement des packages R

Fonctions

Fonctions

Lancer une fonction

Pouvez-vous utiliser la fonction sqrt() dans le bloc ci-dessous pour calculer la racine carrée de 961 ?

sqrt(961)

Code

Utilisez le bloc ci-dessous pour examiner le code source de la fonction sqrt().

sqrt

lm

Comparez le code de la fonction sqrt() au code d’une autre fonction R, lm(). Examinez le corps de la fonction lm() dans le bloc ci-dessous.

lm

Pages d’aide

Hou la la ! La fonction lm() exécute beaucoup de code quand on l’utilise. Mais que fait-elle exactement ? Et surtout intelligiblement…Pour le découvrir, ouvrez la page d’aide pour lm() dans le bloc ci-dessous.

?lm

Commentaires dans le code

Selon vous, que va retourner le morceau de code ci-dessous ? Exécutez-le et voyez par vous-même. Le résultat devrait être… rien ! R n’exécutera rien sur une ligne précédée du symbole #. C’est utile pour écrire des commentaires dans le code : placez-les après un #. Maintenant, supprimez le # et réexécutez le code. Cette fois-ci, vous devriez voir apparaître le résultat de la commande.

# sqrt(961)
sqrt(961)

Arguments

Arguments

args()

rnorm() est une fonction qui génère des variables aléatoires issues d’une loi normale. Exécutez une fonction qui liste les arguments de cette fonction.

args(rnorm)

Arguments optionnels

rnorm() 1

Utilisez rnorm() pour générer 100 valeurs aléatoires qui suivent une loi normale de moyenne 100 et d’écart-type 15.

rnorm(100, mean = 100, sd = 50)

rnorm() 2

Pouvez-vous repérer l’erreur dans le code ci-dessous ? Corrigez le code, puis réexécutez-le.

rnorm(100, mu = 100, sd = 50)
# rnorm(100, mean = 100, sd = 50)

Objets

Objets

Noms des objets

Vous pouvez choisir pratiquement n’importe quel nom qui vous fait plaisir pour désigner un objet R. Une règle bride notre créativité cependant : le nom ne doit pas commencer par un nombre ou par un caractère spécial comme +, -, *, /, ^, !, @, ou &.

Utilisation des objets

Dans le bloc de code ci-dessous, enregistrez les résultats de rnorm(100, mean = 100, sd = 15) dans un objet nommé data. Ensuite, sur une nouvelle ligne, appelez la fonction hist() sur l’objet data pour tracer un histogramme des valeurs aléatoires.

data <- rnorm(100, mean = 100, sd = 15)
hist(data)

Et que se passerait-il si… ?

Selon vous, que se passerait-il si vous affectiez data à un nouvel objet nommé copy ? Exécutez le code ci-dessous, puis examinez à la fois data et copy.

data <- rnorm(100, mean = 100, sd = 15)
copy <- data
data <- rnorm(100, mean = 100, sd = 15)
copy <- data
data
copy

Jeux de données

Les objets permettent de stocker des ensembles de données dans R. En fait, R est même livré avec de nombreux jeux de données pré-chargés. L’un d’entre eux, s’appelle iris : examinez son contenu. Et aussi, comment selon vous pourriez-vous procéder pour en savoir plus sur l’objet iris ?

iris

rm()

Malheur ! Et si vous écrasiez accidentellement un objet ? Pas de panique ! Si cet objet est naturellement fourni dans R ou l’un de ses packages, vous pouvez restaurer la version d’origine de l’objet en supprimant votre version avec rm(). Exécutez rm() sur iris ci-dessous pour restaurer la version initiale du jeu de données iris.

iris <- 1
iris
iris <- 1
iris
rm(iris)
iris

Vecteurs

Vecteurs

Création d’un vecteur

Dans le bloc ci-dessous, créez un vecteur contenant les entiers de un à dix.

c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

:

Si votre vecteur contient une séquence d’entiers adjacents, vous pouvez le créer avec le raccourci :. Bien pratique, puisque cela vous évitera de renseigner les entiers un à un. Exécutez 1:10 dans le bloc ci-dessous. Qu’obtenez-vous ? Alors, selon vous, qu’est-ce que 1:20 est sensé retourner ?

1:10

[]

Vous pouvez selectionner n’importe quel élément d’un vecteur en plaçant une paire de crochets à la suite du vecteur. À l’intérieur des crochets, placez le numéro de l’élément que vous souhaitez extraire. Par exemple, vec[3] va retourner le troisième élément du vecteur nommé vec.

Utilisez le bloc ci-dessous pour extraire le quatrième élément de vec.

vec <- c(1, 2, 4, 8, 16)
vec <- c(1, 2, 4, 8, 16)
vec[4]

Plus de []

Vous pouvez également utiliser les crochets [] pour selectionner plusieurs éléments d’un vecteur. Placez le vecteur c(1, 2, 5) entre les crochets ci-dessous. Qu’est-ce que R retourne ?

vec <- c(1, 2, 4, 8, 16)
vec[]
vec <- c(1, 2, 4, 8, 16)
vec[c(1, 2, 5)]

Noms des éléments

Si les éléments de votre vecteur ont des noms, vous pouvez les extraire… par leur nom ! Pour cela, placez un nom (ou un vecteur de noms) entre parenthèses derrière un vecteur. Entourez chaque nom de guillemets ", par ex. vec2[c("alpha", "beta")].

Extrayez l’élément nommé gamma du vecteur ci-dessous.

vec2 <- c(alpha = 1, beta = 2, gamma = 3)
vec2 <- c(alpha = 1, beta = 2, gamma = 3)
vec2["gamma"]

Opérations vectorisées

A votre avis, qu’est-ce que le code ci-dessous va retourner ? Regardez par vous-même.

c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Recyclage des vecteurs

Prédisez ce que le code ci-dessous renverra. Regardez ensuite le résultat.

1 + c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Types

Types

Types atomiques

De quel type s’agit-il ?

Entier (integer en anglais)

Créez un vecteur d’entiers de un à cinq. Selon vous, pourquoi est-il parfois utile d’utiliser des types integers au lieu de numbers/doubles ?

c(1L, 2L, 3L, 4L, 5L)

Arithmétique en virgule flottante

Les ordinateurs doivent utiliser une quantité limitée de mémoire pour stocker des nombres décimaux (ce qui peut parfois nécessiter une précision infinie). Par conséquent, certaines décimales ne peuvent être enregistrées que sous forme d’approximations plus ou moins précises. De temps en temps, vous remarquerez des effets secondaires de cette imprécision, comme ci-dessous.

Calculez la racine carrée de deux, mettez la réponse au carré (par exemple, multipliez la racine carrée de deux par la racine carrée de deux), puis soustrayez deux du résultat. Quelle réponse attendez-vous ? Quelle réponse obtenez-vous ?

sqrt(2) * sqrt(2) - 2
sqrt(2)^2 - 2

Vecteur (vector)

Chaîne de caractères (character) ou objet ?

L’une des erreurs couramment commise dans R est d’appeler un objet alors que vous aviez en tête une chaîne de caractères et inversement.

Listes

Listes

Listes vs. vecteurs

Fabriquer une liste

Faites une liste qui contient les éléments 1001, TRUE et "stories". Donnez un nom explicite à chaque élément.

list(un_nombre = 1001, logique = TRUE, une_chaine_de_caracteres = "stories")

Extraire un élément

Selectionnez le chiffre 1001 de la liste ci-dessous.

des_trucs <- list(un_nombre = 1001, un_booleen = TRUE, une_chaine_de_caracteres = "stories")
things <- list(un_nombre = 1001, n_booleen = TRUE, une_chaine_de_caracteres = "stories")
things$un_nombre

data.frame

Il est possible de créer un jeu de données (ou data frame en anglais) avec la fonction data.frame(), qui fonctionne de manière tout à fait similaire à c() et list(). Assemblez les vecteurs ci-dessous dans un jeu de données avec les noms de colonnes numbers, logicals, strings.

nums <- c(1, 2, 3, 4)
logs <- c(TRUE, TRUE, FALSE, TRUE)
strs <- c("pomme", "banane", "carotte", "canard")
nombre <- c(1, 2, 3, 4)
logs <- c(TRUE, TRUE, FALSE, TRUE)
caract <- c("pomme", "banane", "carotte", "canard")
data.frame(nb = nombre, logiques = logs, caracteres = caract)

Extraire une colonne

Étant donné qu’un data.frame est un type de liste (avec des éléments nommés), comment pourriez-vous extraire la colonne strings du data frame df ci-dessous ? Essayez !

nums <- c(1, 2, 3, 4)
logs <- c(TRUE, TRUE, FALSE, TRUE)
strs <- c("pomme", "banane", "carotte", "canard")
df <- data.frame(numbers = nums, logicals = logs, strings = strs)
df$strings

Packages

Packages

L’erreur classique

Charger un package

Dans le bloc de code ci-dessous, chargez le package {tidyverse}. {tidyverse} est un metapackage, il charge toute une floppée de packages en même temps. Ainsi, chaque fois que vous chargez {tidyverse}, {tidyverse} charge également {ggplot2}, {dplyr}, {tibble}, {tidyr}, {readr} et {purrr}.

library(tidyverse)

Guillemets

Saviez-vous que library() est une fonction spéciale dans R ? Vous pouvez passer dans library() un nom de package entre guillemets, comme library("tidyverse"), ou sans guillemets, comme library(tidyverse). Les deux fonctionneront ! Ce n’est souvent pas le cas avec les fonctions R.

En général, vous devez toujours utiliser des guillemets, sauf si vous écrivez le nom de quelque chose qui est déjà chargé dans la mémoire de R, comme une fonction, un vecteur ou un data.frame.

Installer des packages

Mais que faire si le package que vous souhaitez charger n’est pas installé sur votre ordinateur ? Comment installer le package {dplyr} sur votre propre ordinateur ?

install.packages("dplyr")

Félicitations !

Toutes nos félicitations. Vous connaissez maintenant le fonctionnement des principes de base de R. Bien que vous ne puissiez vous considérer comme un Data Scientist, ce bref aperçu de R vous aidera pour l’analyse des données. Chaque fois que R fera quelque chose d’inattendu, vous pourrez désormais appliquer vos connaissances sur le fonctionnement de R pour comprendre ce qui n’a pas fonctionné !