Déboguer une fonction avec debugonce() ou browser()

Auteur : Murielle Delmotte
Tags : Autour de R, Ressources
Date :

La détection et la correction des erreurs dans vos scripts ou fonctions R peuvent parfois ressembler à une chasse au trésor. Heureusement, R offre plusieurs outils pour comprendre ce qui se passe dans votre code et diagnostiquer les problèmes. Parmi eux, debugonce() et browser() sont particulièrement utiles pour déboguer des fonctions. Cet article vous présente leur fonctionnement avec un exemple reproductible.

Comprendre debugonce()

La fonction debugonce() permet de placer un point d’arrêt temporaire dans une fonction. Lorsque cette fonction est appelée, R interrompt son exécution et vous donne la possibilité d’explorer son état (valeurs des variables, étapes intermédiaires, etc.) avant de continuer.

La particularité de debugonce() est qu’il agit uniquement pour la prochaine exécution de la fonction. Cela le rend idéal pour inspecter des problèmes sans avoir à modifier le code source.

  • Syntaxe : debugonce(<nom_de_la_fonction>)

Explorer avec browser()

browser() est un autre outil puissant qui insère un point d’arrêt permanent à un endroit spécifique de votre code. Lorsque R rencontre browser() pendant l’exécution d’un script ou d’une fonction, l’exécution est suspendue, vous permettant d’explorer le contexte local.

  • Syntaxe : browser()

Contrairement à debugonce(), browser() est à inclure directement dans votre code, et son effet persiste tant qu’il n’est pas retiré.

Exemple reproductible : Déboguer une fonction avec debugonce() et browser()

Imaginons une fonction simple qui calcule le nombre de caractères total d’une liste de mots, mais qui contient une erreur :

Fonction à déboguer

calculate_total_length <- function(words) {
  total_length <- 0
  for (w in words) {
    total_length <- total_length * nchar(w) # Erreur ici : mauvais calcul
  }
  return(total_length)
}
calculate_total_length(words = c("chat", "chien", "oiseau"))
## [1] 0

Cette fonction contient une erreur : au lieu de retourner le nombre de caractère, elle retourne 0 alors qu’elle devrait retourner 15 !

Détectons et corrigeons cette erreur !

Utilisation de debugonce()

Appelons debugonce() pour inspecter la fonction lors de sa prochaine exécution :

debugonce(calculate_total_length)

Appel avec des arguments

calculate_total_length(words = c("chat", "chien", "oiseau"))

Lorsque vous exécuterez ce code, R entrera en mode interactif. Vous pourrez naviguer dans les étapes de la fonction avec les commandes suivantes :

  • n (next) or Enter : Exécute la prochaine instruction
  • s : Entre dans la fonction
  • f : Sort de la fonction/boucle
  • c (continue) : Reprend l’exécution jusqu’au prochain point d’arrêt ou la fin.
  • Q (stop) : Quitte le mode debug.

Inspectez les valeurs des variables pour comprendre d’où vient l’erreur.

Utilisation de browser()

Pour cibler précisément le calcul de la longueur totale, insérons un point d’arrêt avec browser() directement dans la fonction :

calculate_total_length <- function(words) {
  total_length <- 0
  for (w in words) {
    browser() # Inspectons ici
    total_length <- total_length * nchar(w) # Erreur ici : mauvais calcul
  }
  return(total_length)
}

Appel avec des arguments

calculate_total_length(words = c("chat", "chien", "oiseau"))

Avec browser(), R suspend l’exécution au moment indiqué. Vous pouvez alors :
– Inspecter les variables disponibles : w, total_length.
– Tester des hypothèses directement dans la console : par exemple, vérifier le calcul effectué.

Correction de l’erreur

Après avoir identifié le problème, corrigeons la fonction :

calculate_total_length <- function(words) {
  total_length <- 0
  for (w in words) {
    total_length <- total_length + nchar(w)
  }
  return(total_length)
}

Test après correction

calculate_total_length(words = c("chat", "chien", "oiseau"))
## [1] 15

Conclusion

debugonce() et browser() sont des outils indispensables pour déboguer efficacement vos fonctions en R. Tandis que debugonce() est pratique pour une inspection ponctuelle, browser() est idéal pour insérer des points d’arrêt spécifiques dans votre code et particulièrement utile pour les applications Shiny (en faisant attention à le retirer une fois le débogage fini).

En intégrant ces techniques dans votre flux de travail, vous pourrez localiser et corriger les erreurs rapidement, tout en améliorant votre compréhension du comportement de vos fonctions. Essayez-les dans vos projets !


À propos de l'auteur

Murielle Delmotte

Murielle Delmotte

DATA SCIENTIST – Joueuse de R passionnée


Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


À lire également

Nos formations Certifiantes à R sont finançables à 100% via le CPF

Nos formations disponibles via moncompteformation.gouv.fr permettent de délivrer des Certificats reconnues par l’état, enregistrées au répertoire spécifique de France Compétences. 3 niveaux de certifications existent :

Contactez-nous pour en savoir plus.

Calendrier

07/01/2025

07/01/2025