Utilisez toujours library
. Jamais 1 utilisation require
.
( 1 Presque jamais. Peut-être .)
En résumé, cela est dû au fait que, lors de l'utilisation require
, votre code peut produire des résultats différents et erronés, sans signaler d'erreur . C'est rare mais pas hypothétique! Considérez ce code, qui donne des résultats différents selon que {dplyr} peut être chargé:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Cela peut conduire à des résultats subtilement faux. Utiliser library
au lieu de require
renvoie une erreur ici, signalant clairement que quelque chose ne va pas. C'est bien .
Cela rend également le débogage de tous les autres échecs plus difficile: si vous require
un package au début de votre script et utilisez ses exportations à la ligne 500, vous obtiendrez un message d'erreur «objet« foo »introuvable» à la ligne 500, plutôt qu'un erreur "il n'y a pas de package appelé 'bla'".
Le seul cas d'utilisation acceptable require
est lorsque sa valeur de retour est immédiatement vérifiée, comme le montrent certaines des autres réponses. Il s'agit d'un modèle assez courant, mais même dans ces cas, il est préférable (et recommandé, voir ci-dessous) de séparer le contrôle d'existence et le chargement du package.
Plus techniquement, require
appelle en fait en library
interne (si le package n'était pas déjà attaché - require
effectue donc une vérification redondante, car vérifie library
également si le package a déjà été chargé). Voici une implémentation simplifiée de require
pour illustrer ce qu'il fait:
require = function (package) {
already_attached = paste('package:', package) %in% search()
if (already_attached) return(TRUE)
maybe_error = try(library(package, character.only = TRUE))
success = ! inherits(maybe_error, 'try-error')
if (! success) cat("Failed")
success
}
Les développeurs R expérimentés conviennent:
Yihui Xie , auteur de {knitr}, {bookdown} et de nombreux autres packages dit :
Mesdames et messieurs, je l'ai déjà dit: require () est la mauvaise façon de charger un package R; utilisez plutôt library ()
Hadley Wickham , auteur de packages R plus populaires que quiconque, dit
Utilisation library(x)
dans les scripts d'analyse de données. […] Vous n'avez jamais besoin d'utiliser require()
( requireNamespace()
c'est presque toujours mieux)