Un petit hack pour éviter les conflits de packages sous R

Si vous utilisez le package dplyr pour manipuler vos données, vous avez sans doute déjà été confronté à des conflits de packages.

Les conflits de packages, c'est quoi ?

Personnellement, je rencontre régulièrement des conflits de packages lorsque je cherche à sélectionner certaines variables d’un jeu de données. Pour cela, j’utilise systématiquement une syntaxe `tidyverse` compatible, avec la fonction `select()` du package `dplyr`. Comme cela par exemple, si je ne veux que garder les variables relatives à l’espèce et aux sépales du jeu de données iris 

iris_sepal <- iris %>%
select(Species, Sepal.Width, Sepal.Length) 

Mais parfois au cours de mon analyse de données, patatra….le code ne fonctionne pas ! Et c’est difficile de comprendre pourquoi parce qu’aucun message d’erreur n’est renvoyé !

En fait, ce qui se passe c’est un conflit de package : ce n’est pas la fonction `select()` du package `dplyr` qui est utilisée par R, mais la fonction `select()` d’un autre package. Et comme celui-ci n’est pas `tidyverse` compatible, et bien la sélection de variables ne s’effectue pas.

Et ce conflit de package ne concerne pas que la fonction `select()` de `dplyr` ! Il peut aussi concerner les fonctions `filter()` et `summarise()`, mais aussi des fonctions d’autres packages.

Une solution pas très satisfaisante aux conflits de packages

Alors pour éviter ce problème de conflit de packages, on peut indiquer  à R dans quel package il doit aller chercher la fonction désirée. Pour cela, on ajoute le nom du package, suivi de deux fois deux points, avant la fonction, par exemple dplyr::select() comme cela :

iris_sepal <- iris %>%
dplyr::select(Species, Sepal.Width, Sepal.Length) 

C’est une solution qui n’est pas extrêmement pratique parce qu’il faut ajouter le nom du package à chaque fois qu’on utilise la fonction….

THE SOLUTION aux conflits de packages

Et puis hier après midi, sur twitter, j’ai vu ce tweet, avec THE SOLUTION !

THE SOLUTION, consiste à installer le package `conflicted`, puis à utiliser la fonction `conflict_prefer()` pour forcer l’utilisation des fonctions d’un certain package (que l’on va spécifier) ! Comme ceci par exemple pour forcer l’utilisation des fonctions `select()` et `filter()` de `dplyr` :

library(conflicted)

## Warning: package 'conflicted' was built under R version 3.6.2

conflict_prefer("filter", "dplyr")

## [conflicted] Will prefer dplyr::filter over any other package

conflict_prefer("select", "dplyr")

## [conflicted] Will prefer dplyr::select over any other package 

Il suffit donc de déclarer ses préférences une seule fois, enfin, une seule fois par fonction, mais c’est déjà vraiment mieux !

Si vous travaillez en R markdown, vous pouvez, par exemple, les insérer dans le chunk set up, comme ceci :

Et comme je suis une grande fan de la fonction `here()`, du package `here` pour créer les chemins d’accès des jeux de données ou des images et que j’emploie systématiquement la syntaxe `here::here()`, je pense que je vais aussi l’intégrer dans une fonction `conflict_prefer()`.

Et vous, avec quelle fonction avez-vous déjà constaté des conflits ? Indiquez les moi en commentaire.

Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏

10 Responses

  1. Bonjour Claire,
    Juste encore un jour pour te souhaiter une bonne année 2020 et une excellente santé à toi et ceux qui te sont cher. Membre de la première heure de ton fan-club, je ne manque pas de parcourir chacun de tes posts même si je ne pratique pas beaucoup dans mon quotidien. Ils accrochent toujours ma curiosité et mon intérêt. J’apprécie leurs qualités pédagogiques et pragmatiques. Leur format bien ciblé et compact permet de les assimiler très vite et de les catégoriser facilement. Leur mise en pratique immédiate les rend précieux.
    Continue, on compte sur toi…

  2. Super Claire, Merci beaucoup, pas plus tard qu’aujourd’hui j’ai été confronté à un conflit de package pour les fonctions summarise de dplyr et celle de plyr. du coup, ne connaissant pas la fonction conflict_prefer(), j’écrivais à chaque fois dplyr:: summarise. trop long si nous avons plusieurs de lignes de code à éffectuer.

    1. Bonjour,
      J’utilise cette fonction en routine pour les fonctions select() et filter() du package dplyr, pour la fonction here() du package here, et parfois aussi pour la fonction some() du package car.
      Bonne continuation.

  3. Bonjour,
    Pour déclarer un choix préalable à un éventuel conflit de fonction, il faut connaitre l’ensemble des fonctions de chaque package importé. I
    Y a t il un moyen de detecter des pseudo doublons entre 2 packages?
    Cordialement,

    1. Bonjour tout le monde,
      d’abord un immense merci à toi Claire ! Je débute en R et ce blog est une mine d’or, avec un style (tant sur les explications que sur le code) qui me parle beaucoup.
      Pour Gaetan, je ne sais pas si c’est toujours comme ça, mais en chargeant tidyverse j’ai le message suivant (que cet article m’a beaucoup aidé à comprendre 😉 ) :
      library(tidyverse)
      ## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
      ## ✔ ggplot2 3.3.6 ✔ purrr 0.3.5
      ## ✔ tibble 3.1.8 ✔ dplyr 1.0.10
      ## ✔ tidyr 1.2.1 ✔ stringr 1.4.1
      ## ✔ readr 2.1.3 ✔ forcats 0.5.2
      ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
      ## ✖ dplyr::filter() masks stats::filter()
      ## ✖ dplyr::lag() masks stats::lag()

Laisser un commentaire

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

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.