10  Résoudre un problème avec R

10.1 Tâches concernées et recommandations

Votre code ne fait pas ce que vous voudriez qu’il fasse et vous ne comprenez pas ce qui ne fonctionne pas. Il faut alors chercher l’origine du problème, et demander de l’aide si vous ne parvenez pas à trouver une solution. Cette fiche explique comment isoler le problème et comment demander de l’aide.

Tâche concernée et recommandation

Il est recommandé de suivre la méthode suivante pour résoudre un problème avec R :

  • Commencer par isoler le problème en le reproduisant sur un jeu de données publiques (iris, cars,… ), et en réduisant le code à un exemple minimal ;
  • Si vous avez un message d’erreur, copier le dans un moteur de recherche, et vérifier si la question a déjà été traitée ;
  • Posez une question sur Stackoverflow, un forum ou un service de messagerie instantanée en incluant toujours le code permettant de reproduire l’erreur.

10.2 Commencer par isoler le problème

Quand on rencontre un problème en travaillant sur un programme, les sources d’erreurs potentielles sont multiples et pas toujours évidentes à identifier si on s’en tient aux messages d’erreur. De plus, il se peut que l’origine de l’erreur se situe à une étape intermédiaire de votre programme, et non à l’étape qui produit une erreur ou qui vous semble problématique.

Un problème peut être dû à deux types d’erreur : soit une erreur de votre part (cas le plus fréquent), soit d’un bug dans une fonction de R (cas plus rare). Une erreur de votre part peut par exemple provenir d’un jeu de données mal préparé (présence de valeurs manquantes, valeurs hors normes, problème de format), d’un mauvais usage d’une fonction et de ses options, d’une version erronée d’un package… Un bug dans une fonction de R peut être dû au fait que les développeurs n’ont pas prévu le cas dans lequel vous vous trouvez, ou que le code de la fonction contient une erreur. Ces deux types d’erreur se résolvent de façon très différente. S’il s’agit d’une erreur de votre part, il faut corriger votre programme. S’il s’agit d’un bug dans une fonction de R, il faut le signaler aux développeurs de la fonction concernée. Il est donc essentiel d’isoler rapidement le problème pour comprendre de quel type d’erreur il s’agit.

Voici deux conseils pour isoler le problème. Dans la grande majorité des cas, ces deux conseils sont suffisants pour trouver l’origine du problème et le résoudre.

  • Vous pouvez commencer par exécuter votre programme pas-à-pas en vérifiant à chaque étape si le résultat intermédiaire correspond à ce que vous attendez, jusqu’à trouver l’instruction qui pose problème.
  • Une fois que vous avez identifié l’étape problématique, vous pouvez consulter la documentation des fonctions que vous utilisez en exécutant la commande ?fonction (exemple: ?mutate), et lire la fiche correspondante de la documentation utilitR s’il en existe une.

Si la lecture de la documentation ne vous a pas permis de résoudre le problème, voici comment procéder pour aller plus loin. vous pouvez créez un nouveau script et essayer de reproduire ce que vous souhaitez faire, mais avec un jeu de données public (iris, mtcars, ggplot2::diamonds…). Cette approche est très fréquente sur internet et s’appelle MWE (minimum working example ou exemple minimal reproductible). L’intérêt d’écrire un exemple minimal est double :

  • si l’exemple minimal aboutit au résultat que vous souhaitez, vous savez que le problème provient d’une erreur de votre part, mais pas des fonctions que vous souhaitez utiliser. Il faut donc vérifier à nouveau les étapes précédentes du programme ;
  • si l’exemple minimal n’aboutit pas au résultat que vous souhaitez, vous disposez maintenant d’un exemple que vous allez pouvoir utiliser pour demander de l’aide.

Si vous ne trouvez pas jeu de données adapté à votre problème, vous pouvez en constituer un nouveau à l’aide des fonctions data.frame(), tibble::tibble() ou data.table::data.table().

10.3 Chercher de l’aide

10.3.1 La question a-t-elle déjà été posée ?

La première chose à faire est de vérifier que la question n’a pas déjà été posée et résolue : il est rare de rencontrer un problème dont la solution ne figure pas déjà en ligne, en particulier quand on débute avec R. Si vous avez un message d’erreur, vous pouvez le copier/coller dans un moteur de recherche. Si vous n’en avez pas, le plus efficace est d’essayer de formuler votre problème et de rechercher ça dans un moteur de recherche générique, ou directement sur le moteur de recherche de Stack Overflow.

Les ressources disponibles en ligne sur R en anglais sont beaucoup plus nombreuses et riches que celles existant en français. Il est donc préférable de faire des recherches en anglais, même si cela vous demande un effort supplémentaire.

10.3.2 Où chercher de l’aide ?

Selon le type de problème, votre niveau en anglais et le temps que vous êtes prêts à attendre, vous pouvez chercher de l’aide aux endroits suivants :

  • Stackoverflow (SO) est un site de questions/réponses sur de nombreuses thématiques liées à l’informatique. C’est la façon la plus efficace d’obtenir une réponse rapide, y compris sur des sujets particulièrement complexes, pour peu qu’on accepte de se plier au formalisme demandé (voir plus bas) ;
  • le groupe slack grrr (francophone) dispose d’un canal #questions qui est assez réactif. Toujours en français, le forum du Cirad héberge une importante communauté R. S’il n’est plus la référence qu’il a longtemps été, il est toujours actif ;
  • Au sein du service public français, il est possible de trouver de l’aide sur la messagerie instantanée Tchap, sur le canal #langage R ;
  • A l’Insee, il y a également un canal dédié sur Tchap (#Insee - Outils stats v2).

Ces différentes plateformes sont classées par nombre d’utilisateurs décroissant, ce qui a un impact mécanique sur la rapidité des réponses et la chance de tomber sur un utilisateur capable de vous aider. Cependant, certaines problématiques sont propres à l’Insee ou au SSP et seront plus facilement traitées à ce niveau (problèmes d’environnement, de proxy ou de pare-feu par exemple). Par ailleurs, il peut être plus rassurant au début de poser sa question dans un environnement qu’on connaît.

10.3.3 Comment poser une question ?

La formulation de votre question dépend de son contenu.

10.3.3.1 Résoudre une erreur dans un programme

Si vous essayez de résoudre une erreur dans un programme, votre question doit contenir les éléments suivants :

  1. Une description en une phrase du problème que vous rencontrez ;
  2. Le code de l’exemple minimal reproductible ;
  3. ce que vous obtenez (données, messages d’erreur éventuels) ;
  4. ce que vous aimeriez obtenir.

Il est essentiel que l’exemple se suffise à lui-même. N’oubliez pas les appels éventuels de packages et travaillez avec des jeux de données publiques ou que vous reconstruisez dans votre code. Un bon test peut être de vider l’environnement, de relancer la session et d’exécuter votre exemple pour vérifier qu’il s’exécute correctement.

Tip

Il arrive fréquemment que des erreurs soient difficiles à reproduire du fait d’un environnement différent. Il peut être utile, à la fin d’une question, de faire figurer le résultat de la commande sessionInfo() pour aider les autres personnes à comprendre dans quel environnement un problème advient

10.3.3.2 Savoir comment réaliser une opération

Si votre problème est que vous ne savez pas comment réaliser une certaine opération, votre question doit contenir les éléments suivants :

  1. Une description rapide des données que vous utilisez ;
  2. Une description de la tâche que vous souhaitez réaliser ;
  3. Une description de ce que vous souhaitez obtenir.

10.4 Comment rédiger sa question ?

Une question doit être lisible et intelligible, il faut donc accorder de l’attention à la mise en page. La plupart des sites d’entraide ou des messageries instantanées reposent sur la syntaxe Markdown ce qui permet d’isoler les blocs de code afin de les rendre lisibles la fiche R Markdown développe avec plus de détails ce format d’édition.

Les morceaux de code doivent être introduits dans des blocs de la manière suivante:

```r
print("toto")
```

Ceci permet de séparer de manière claire les éléments à exécuter dans R d’autres éléments (explications notamment). Le package reprex propose des fonctionnalités pour faciliter l’édition d’un post à partir d’un script (exemple ici)

10.5 Zoom sur Stack Overflow

10.5.1 Fonctionnement général

Stack Overflow est un site de questions/réponses qui fait référence sur de nombreux sujets en lien avec l’informatique. Son fonctionnement s’apparente à un forum : des utilisateurs posent des questions, d’autres y répondent. L’objectif de chaque page de discussion de Stack Overflow est de proposer une question aussi claire que possible, immédiatement suivie de la réponse la plus pertinente (et éventuellement avec les autres réponses ensuite). Une particularité essentielle de Stack Overflow est donc que les réponses ne sont pas ordonnées chronologiquement mais par pertinence. Par ailleurs, si la question a besoin d’être précisée ou mise à jour, l’auteur est invité à la modifier.

La pertinence des réponses est établi en fonction du choix de la personne qui a posé la question (elle décide de la réponse qu’elle accepte), et des autres contributeurs : tout le monde peut voter pour les réponses, positivement ou négativement.

Les contributeurs de Stack Overflow sont hiérarchisés par un complexe système de réputation : on gagne des points de réputation quand on pose des questions jugées pertinentes, et quand on apporte des réponses qui sont jugées pertinentes. Plus la réputation d’un contributeur est élevée, plus il peut contribuer au site (nombre de votes disponibles, possibilité d’éditer les questions d’autres contributeurs voire d’en supprimer).

10.5.2 Poser une question sur Stack Overflow

En plus des conseils donnés plus haut, voici quelques règles spécifiques à Stack Overflow :

  • il est nécessaire de créer un compte pour poser une question (mais pas pour consulter les réponses) ;
  • votre question doit impérativement être rédigée en anglais, et comprendre un exemple minimal reproductible ;
  • il faut accorder une importance particulière au titre de votre question, votre titre doit résumer le problème autant que possible ;
  • pensez à insérer des étiquettes (tags). Les tags permettent de catégoriser les questions. Ainsi, le tag #r rassemble toutes les questions ayant trait à R, le tag #dplyr celles ayant trait à dplyr, ainsi de suite ;
  • répondez aux éventuelles questions de clarification qu’on vous posera en commentaires en éditant votre question ;
  • votez pour les réponses qui vous semblent pertinentes. Cela aide la communauté, et donc vous également, à déterminer les meilleures solutions à un problème ;
  • prenez soin de votre réputation en évitant les doublons et en prenant le temps de rédiger votre question.

10.6 Pour en savoir plus