dplyr
pour manipuler vos données, vous avez sans doute déjà été confronté à des conflits de packages.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.
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….
Et puis hier après midi, sur twitter, j’ai vu ce tweet, avec THE SOLUTION !
TIL: I learnt about the conflicted 📦
My filter function always gets masked, so my solution till today was dplyr::filter.
But there is a better way! You can set your function:library preference at the top of your script! 😭🙏
e.g. conflict_prefer(“filter”, “dplyr”) #rstats— Birunda Chelliah @ Rstudio::conf (@cbirunda) January 28, 2020
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 🙏
Image par rodrigomullercwb , Anand Kumar ,et talha khalil de Pixabay
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.
10 Responses
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…
Merci beaucoup Claire de votre article et travail consacré au service de l’humanité!
Thanks Claire this new, it’s very helpful
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.
Cool, c’est un plus. merci Claire
Merci ! Merci ! Merci ! 🙂
Merci très utile pour la fonction select
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.
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,
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()