Créer des fonctions personnalisées en R

@joekakone

Joseph Konka @joekakone

03/03/2026 · 6 min

Découvrez comment écrire des fonctions réutilisables en R : arguments avec valeurs par défaut, renvoi de résultats multiples via des listes, et portée des variables.

En programmation, le principe DRY (Don't Repeat Yourself) stipule qu'une même séquence de code ne doit pas être copiée-collée à de multiples endroits.

Dès que vous effectuez le même calcul ou le même nettoyage plus de deux fois dans une analyse, il est indispensable de créer une fonction personnalisée.

En R, les fonctions sont des objets de premier ordre (first-class objects) : elles peuvent être stockées dans des variables, passées comme arguments à d'autres fonctions et renvoyées comme résultats.


1. Définition et syntaxe d'une fonction#

Pour déclarer une fonction, on utilise le mot-clé function() suivi des arguments entre parenthèses et du corps de la fonction entre accolades {} :

# Fonction pour convertir des degrés Celsius en Fahrenheit
celsius_vers_fahrenheit <- function(temperature_c) {
  temperature_f <- temperature_c * 1.8 + 32
  return(temperature_f)
}

# Appel de la fonction
celsius_vers_fahrenheit(25)  # [1] 77
celsius_vers_fahrenheit(0)   # [1] 32

[!NOTE] Le retour implicite en R :
L'instruction return() est facultative. Si elle est omise, R renvoie automatiquement le résultat de la dernière expression évaluée dans le corps de la fonction. Cependant, l'utilisation explicite de return() est vivement recommandée pour la lisibilité.


2. Arguments par défaut et arguments nommés#

Vous pouvez attribuer des valeurs par défaut aux arguments qui seront utilisées si l'utilisateur ne les précise pas lors de l'appel :

# Calcul d'un prix TTC avec un taux de TVA par défaut à 20%
calculer_ttc <- function(prix_ht, tva = 0.20, remise = 0) {
  prix_apres_remise <- prix_ht * (1 - remise)
  prix_ttc <- prix_apres_remise * (1 + tva)
  return(round(prix_ttc, 2))
}

# 1. Utilisation des valeurs par défaut
calculer_ttc(100) # TVA = 20%, remise = 0 -> [1] 120

# 2. Spécification d'arguments positionnels
calculer_ttc(100, 0.055) # TVA réduite à 5.5% -> [1] 105.5

# 3. Spécification d'arguments nommés (dans n'importe quel ordre)
calculer_ttc(prix_ht = 100, remise = 0.10) # 10% de remise -> [1] 108

3. Renvoyer plusieurs résultats : La puissance des listes#

Une fonction en R ne peut renvoyer qu'un seul objet via return(). Pour renvoyer plusieurs indicateurs ou tableaux calculés simultanément, on les encapsule dans une list() :

# Fonction calculant un diagnostic statistique complet
calculer_stats <- function(vecteur) {
  # Nettoyage des NA
  v_propre <- vecteur[!is.na(vecteur)]

  resultats <- list(
    taille = length(v_propre),
    moyenne = mean(v_propre),
    mediane = median(v_propre),
    ecart_type = sd(v_propre),
    etendue = max(v_propre) - min(v_propre)
  )

  return(resultats)
}

# Appel et exploitation
bilan <- calculer_stats(c(12, 18, 14, NA, 22, 16))
bilan$moyenne     # [1] 16.4
bilan$ecart_type  # [1] 3.847077

4. Portée des variables (Scoping)#

Les variables créées à l'intérieur d'une fonction ont une portée locale : elles existent uniquement le temps de l'exécution et sont détruites dès que la fonction se termine, sans jamais polluer ou écraser l'environnement global de travail.

total <- 500 # Variable globale

ma_fonction <- function() {
  total <- 10 # Variable locale
  print(paste("Dans la fonction :", total))
}

ma_fonction() # "Dans la fonction : 10"
print(total)  # "500" (la variable globale n'a pas bougé !)

5. La famille apply : L'alternative fonctionnelle aux boucles#

Plutôt que d'écrire des boucles for pour appliquer une fonction sur toutes les lignes ou colonnes d'un tableau, R propose la célèbre famille apply :

mat <- matrix(1:12, nrow = 3, ncol = 4)

# 1. apply(X, MARGIN = 1, FUN) : applique la fonction par LIGNE
apply(mat, MARGIN = 1, mean) # Moyenne de chaque ligne

# 2. apply(X, MARGIN = 2, FUN) : applique la fonction par COLONNE
apply(mat, MARGIN = 2, sum)  # Somme de chaque colonne

# 3. sapply(X, FUN) : applique une fonction sur un vecteur ou une liste
prenoms <- c("claire", "thomas", "julie")
sapply(prenoms, toupper) # Passe en majuscules

Mise en pratique#

  1. Écrivez une fonction calculer_imc(poids_kg, taille_m) qui calcule l'Indice de Masse Corporelle selon la formule : \(\text{IMC} = \frac{\text{poids}}{\text{taille}^2}\).
  2. Ajoutez un contrôle vérifiant que le poids et la taille sont strictement positifs (en utilisant stop("Erreur : valeurs invalides")).
  3. Enrichissez la fonction pour qu'elle renvoie une liste contenant :
  4. valeur_imc : l'IMC arrondi à 1 décimale.
  5. interpretation : "Normal" si \(18.5 \le \text{IMC} < 25\), "Surpoids" si \(\text{IMC} \ge 25\), et "Insuffisance" sinon.
  6. Testez votre fonction avec un individu de 70 kg mesurant 1,75 m.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue