Programmation en R : tutoriel pour débutant

Le langage de programmation en R est un langage de programmation statistique populaire utilisé principalement en sciences et en mathématiques pour le calcul statistique. R est un langage intéressant comportant des caractéristiques distinctes. Une fois que vous vous y êtes habitués, travailler avec ce langage est assez amusant.

Qu’est-ce que le langage de programmation en R ?

R n’est pas un langage de programmation général tel que Java ou Python. Au contraire, celui-ci est spécialement utile dans le domaine particulier du Statistical Computing, ou calcul statistique en français. Dans ce domaine, R figure depuis des années parmi les 20 langages de programmation les plus populaires, et ce malgré une forte concurrence.

Ce qui rend R spécial n’est pas seulement le langage en lui-même, mais l’ensemble de ses caractéristiques. La programmation en R a généralement lieu dans un environnement interactif, comportant lecture, évaluation, impression en boucle (Read-Eval-Print Loop ou REPL) et aide intégrée. Le langage Open Source est pris en charge par un écosystème sophistiqué ; la communauté gère le référentiel The Comprehensive R Archive Network (CRAN). Les ensembles de données, les livres blancs scientifiques sur les nouvelles approches et les nouveaux ensembles de données sont également continuellement mis à jour.

Ensemble, ces fonctionnalités font du R l’environnement de programmation idéal pour les statistiques et la science des données. En particulier, la nature interactive de l’environnement vous invite à la recherche et vous permet d’apprendre le langage et les mathématiques sous-jacentes de manière ludique.

R est un langage de programmation de statistique et de données

R est un langage de programmation statistique qui utilise divers concepts tels que la distribution normale, les tests statistiques, les modèles et la régression. En plus du R, il existe un certain nombre de langages scientifiques comparables. Outre le produit commercial Matlab, le plus récent langage Julia doit tout particulièrement être mentionné. De plus, un autre concurrent important ces dernières années est Python.

Contrairement à Python, R intègre un support natif pour la programmation statistique. La différence réside dans la façon dont le langage fonctionne par rapport aux valeurs. Les données sont le plus souvent multiples, de sorte que R calcule généralement plusieurs valeurs à la fois. Alors que dans presque tous les autres langages la valeur la plus simple est un nombre unique, R est un cas particulier.

Les opérations mathématiques peuvent être effectuées dans n’importe quel langage de programmation. Illustrons l’approche du R en matière de traitement de données avec un exemple simple. Ici, nous ajoutons deux nombres :


10 + 5
R

Jusqu’à présent rien d’inhabituel. Toutefois, la même opération d’ajout peut être appliquée à une liste de numéros dans R. Nous combinons deux nombres dans une liste et ajoutons une valeur constante :

# returns 15, 25
c(10, 20) + 5
R

Un résultat surprenant pour les programmeurs expérimentés. Même un langage moderne et dynamique comme Python ne permet pas ceci :

# throws an error
[10, 20] + 5
R

Avec R, vous pouvez même ajouter deux listes. Les éléments de liste ne sont pas combinés, mais l’opération mathématique appropriée est exécutée pour chaque élément :

# returns 42, 69
c(40, 60) + c(2, 9)
R

Dans les langages plus anciens tels que Java ou C++, vous avez besoin d’une boucle pour traiter plusieurs éléments d’une liste. Ces langages séparent strictement les valeurs individuelles, les scalaires, les structures de données composites et les vecteurs. Avec R, le vecteur est l’unité de base. Un scalaire est un cas particulier dans la programmation en R en tant que vecteur à élément unique.

Pour les statistiques, la précision mathématique a été adoucie, car on s’attend à ce qu’il y ait des incertitudes et des données imparfaites par rapport à la réalité. Quelque chose peut toujours mal tourner. Heureusement, R est tolérant aux problèmes dans une certaine mesure. Le langage peut traiter les valeurs manquantes sans provoquer le blocage d’un script en cours d’exécution.

Illustrons la robustesse de ce langage avec un exemple. Normalement, vous pouvez provoquer une erreur dans n’importe quel langage de programmation en divisant un nombre par zéro. Cependant, avec R, la valeur Inf est notée comme résultat de la division par zéro, ce qui permet de la filtrer facilement des données lors d’une étape de nettoyage ultérieure :

# list of divisors, containing zero
divisors = c(2, 4, 0, 10)
# returns `c(50, 25, Inf, 10)`
quotients = 100 / divisors
# filter out Inf; returns `c(50, 25, 10)`
cleaned_quotients = quotients[quotients != Inf]
R

R prend en charge la programmation OOP et fonctionnelle

La programmation avec R est extrêmement flexible, ce langage ne peut pas être clairement classé dans la hiérarchie des paradigmes de programmation. Il est pris en charge par un système OOP, mais les définitions de classe habituelles ne seront pas trouvées. Dans le cadre d’une utilisation quotidienne, les approches fonctionnelles et impératives sont principalement utilisées, en particulier les caractéristiques fonctionnelles, qui sont bien adaptées au traitement des données, sont particulièrement marquées.

Semblable au JavaScript,ce système objet brille par sa flexibilité. Les fonctions génériques qui peuvent être appliquées à des objets de différents types sont similaires à Python. Par exemple, dans la programmation en R se retrouve la fonction length(), semblable à len() de Python.

Comment fonctionne la programmation en R ?

D La programmation en R concerne les données, car c’est sur elles que reposent les statistiques. Pour développer une solution à un problème, vous avez besoin d’un ensemble de données. Malheureusement, cet ensemble n’existe souvent pas au moment du développement. On commence donc souvent un projet de programmation en R en simulant des données. Nous écrivons le code, testons la fonctionnalité et échangeons ultérieurement les données de test pour des données réelles.

Comment le code R est-il exécuté ?

Comme Ruby ou Python, R est un langage de script dynamique et interprété. Contrairement au langage C, R ne sépare pas le code source et le code exécutable. Le développement est principalement interactif, c’est-à-dire qu’on alimente l’interprétation ligne par ligne avec le code source, exécuté en temps réel. Les variables sont générées automatiquement selon les besoins et les noms sont liés au moment de l’exécution.

L’effet de cette programmation interactive et dynamique est comparable à être à l’intérieur du programme en cours d’exécution. Les objets déjà créés peuvent être examinés et modifiés, donc les nouvelles idées peuvent être testées immédiatement. La commande help permet d’accéder à la documentation relative à la syntaxe et à la fonction :

# view help for `for` syntax
help('for')
# view help for `c()` function
help(c)
R

Les fichiers de script peuvent être chargés dynamiquement à partir de l’interpréteur. La commande « source » fonctionne comme la commande équivalente « shell ». Lorsqu’elle est appelée, le contenu d’un fichier R source est lu et introduit dans la session en cours :

source('path/to/file.r')
R

Quelle est la syntaxe du langage de programmation en R ?

Le langage de script utilise les accolades connues de C et Java pour séparer le corps des fonctions et des instructions de contrôle. Contrairement à Python, l’indentation de code n’affecte pas sa fonctionnalité. Les commentaires commencent par un hachage, comme dans Ruby et Python, et aucun point-virgule n’est requis à la fin d’une instruction.

Avec une certaine expérience, le code R peut être reconnu facilement grâce à certaines particularités du langage. En plus du signe égal comme opérateur d’affectation, deux opérateurs de type flèche sont utilisés pour les affectations. Pour inverser le sens de l’affectation :

# equivalent assignments
age <- 42
'Jack' -> name
person = c(age, name)
R

Une autre caractéristique typique du code R est une notation pseudo-objet de type object.method() :

# test if argument is a number
is.numeric(42)
R

La fonction is.numeric() apparaît comme une méthode numeric() qui appartient à un objet nommé is. Cependant, ce n’est pas le cas. En programmation en R, le point est un caractère régulier, la fonction peut donc être appelée is_numeric au lieu de is.numeric.

La fonction de concaténation c() est utilisée pour générer les vecteurs omniprésents dans la programmation en R :

people.ages <- c(42, 51, 69)
R

Si la fonction est appliquée aux vecteurs, ils sont combinés pour former un vecteur contigu :

# yields `c(1, 2, 3, 4)`
c(c(1, 2), c(3, 4))
R

Contrairement à la plupart des langages de programmation, R commence à indexer les éléments d’un vecteur à 1. Cela demande une certaine adaptation, mais permet d’éviter les redoutables « off-by-one errors ». L’indice le plus élevé d’un vecteur correspond à la longueur de ce dernier :

# create a vector of names
people <- c('Jack', 'Jim', 'John')
# access the first name
people[1] == 'Jack'
# access the last name
people[length(people)] == 'John'
R

Comme avec Python, la programmation en R inclut également le concept de découpage. Une tranche peut être utilisée pour indexer une partie d’un vecteur. Ceci est basé sur des séquences qui sont prises en charge nativement. Ci-dessous, nous créons une séquence de numéros et en sélectionnons une partie :

# create vector of numbers between 42 and 69
nums = seq(42, 69)
# equivalent assignment using sequence notation
nums = 42:69
# using a sequence, slice elements 3 through 7
sliced = nums[3:7]
R

Comment les structures de contrôle fonctionnent-elles dans la programmation en R ?

Les opérations de base en programmation en R sont définies pour les vecteurs. Ainsi, les boucles sont rarement nécessaires car une opération est effectuée directement sur l’ensemble du vecteur, les éléments individuels étant modifiés. Mettons au carré les dix premiers nombres positifs sans boucle :

nums <- seq(10)
squares <- nums ** 2
squares[3] == 9
R

Lorsque vous utilisez en programmation en R une boucle for, il est important de noter que celles-ci ne fonctionnent pas comme en C, Java ou JavaScript. Sans passer par une variable de boucle, on itère directement sur les éléments, comme en Python :

people = c('Jim', 'Jack', 'John')
for (person in people) {
    print(paste('Here comes', person, sep = ' '))
}
R

Bien sûr, en programmation en R, on peut utiliser if-else en tant que structure de contrôle de base. Cependant, dans de nombreux cas, elle peut être remplacé par des fonctions de filtrage ou par l’indexation logique des vecteurs. Nous créons un vecteur avec d’âges et filtrons les « plus ou moins de 18 ans » en deux variables sans avoir besoin d’une boucle for ou d’un if else :

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# filter adults
adults = ages[ages > 18]
# filter children
children = ages[ages < 18]
# make sure everyone is accounted for
length(adults) + length(children) == length(ages)
R

Par souci d’exhaustivité, l’approche équivalente avec les structures de contrôle :

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# start with empty vectors
adults = c()
children = c()
# populate vectors
for (age in ages) {
    if (age > 18) {
        adults = c(adults, age)
    }
    else {
        children = c(children, age)
    }
}
R

Qu’est-ce qui est nécessaire pour débuter la programmation en R ?

Pour débuter la programmation en R, vous n’avez besoin que d’une installation R locale. Les programmes d’installation de tous les principaux systèmes d’exploitation sont disponibles pour le téléchargement. Une installation R standard inclut un interpréteur graphique avec REPL, une aide intégrée et un éditeur. Pour un codage productif, vous devez utiliser l’un des éditeurs de code établis. R-Studio offre une alternative intéressante pour l’environnement R.

Pour quels projets R convient-il ?

La programmation en R est fréquemment utilisée en sciences et en recherche, par exemple, en bio-informatique et en apprentissage machine. Toutefois, le langage convient à tous les projets qui utilisent la modélisation statistique ou des modèles mathématiques. Pour le traitement de texte, la programmation en R est moins avancée que Python.

Les calculs et visualisations habituels dans les feuilles de calcul peuvent être remplacés par du code R. Il en résulte une nette séparation des préoccupations, car les données et le code ne sont pas combinés dans les cellules. Cela vous permet d’écrire le code une fois et de l’appliquer à l’ensemble des données. Il n’y a pas non plus de risque d’écraser la formule d’une cellule lors de modifications manuelles.

Pour les publications scientifiques, R est considéré comme la référence. La séparation du code et des données permet une reproductibilité scientifique. L’écosystème mature d’outils et de packages permet la création de flux de publication efficaces. Les évaluations et visualisations sont générées automatiquement à partir du code ainsi que des données, puis intégrées dans des documents LaTeX ou RMarkdown de haute qualité.