web-dev-qa-db-fra.com

Quelle est la difference entre require () et library ()?

Quelle est la différence entre require() et library()?

506
Marco

Il n'y en a pas beaucoup dans le travail quotidien.

Cependant, selon la documentation des deux fonctions (accessible en plaçant un ? avant le nom de la fonction et en appuyant sur Entrée), require est utilisé dans les fonctions, car il émet un avertissement et continue si le paquet n'est pas trouvé, alors que library lève une erreur.

334
richiemorrisroe

Un autre avantage de require() est qu'il renvoie une valeur logique par défaut. TRUE si les packages sont chargés, FALSE si ce n'est pas le cas.

> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'abc'
> test
[1] FALSE

Vous pouvez donc utiliser require() dans des constructions telles que celle ci-dessous. Ce qui est principalement pratique si vous souhaitez distribuer votre code dans notre installation de R, où des packages pourraient ne pas être installés.

if(require("lme4")){
    print("lme4 is loaded correctly")
} else {
    print("trying to install lme4")
    install.packages("lme4")
    if(require(lme4)){
        print("lme4 installed and loaded")
    } else {
        stop("could not install lme4")
    }
}
246
Thierry

Vous pouvez utiliser require() si vous souhaitez installer des packages si et seulement si nécessaire, tels que:

if (!require(package, character.only=T, quietly=T)) {
    install.packages(package)
    library(package, character.only=T)
}

Pour plusieurs colis, vous pouvez utiliser

for (package in c('<package1>', '<package2>')) {
    if (!require(package, character.only=T, quietly=T)) {
        install.packages(package)
        library(package, character.only=T)
    }
}

Conseils Pro:

  • Lorsqu'il est utilisé dans le script, vous pouvez éviter un écran de dialogue en spécifiant le paramètre repos de install.packages(), tel que

    install.packages(package, repos="http://cran.us.r-project.org")
    
  • Vous pouvez encapsuler require() et library() dans suppressPackageStartupMessages() pour supprimer les messages de démarrage du package, et également utiliser les paramètres require(..., quietly=T, warn.conflicts=F) si nécessaire pour maintenir les installations silencieuses.

64
Daniel Sparing

En plus des bons conseils déjà donnés, j'ajouterais ceci:

Il est probablement préférable d'éviter d'utiliser require()sauf si vous utiliserez réellement la valeur renvoyée, par exemple, dans une boucle de vérification des erreurs telle que donnée par thierry.

Dans la plupart des autres cas, il est préférable d’utiliser library(), car cela donnera un message d’erreur au moment du chargement du paquet si celui-ci n’est pas disponible. require() échouera simplement sans erreur si le paquet n'est pas là. C’est le meilleur moment pour savoir si le paquet doit être installé (ou peut-être même n’existe-t-il pas car il s’est mal orthographié). Obtenir un retour d'erreur dès que possible et au moment opportun évitera de possibles problèmes avec la recherche de la raison pour laquelle le code échoue ultérieurement lorsqu'il tente d'utiliser des routines de bibliothèque.

57
dww

Toujours utiliser library. Jamais1 utilisez require.

(1 Presque jamais. Peut-être .)

En un mot, ceci est dû au fait que, lorsque vous utilisez require, votre code peut générer 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é ou non:

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

Cela peut conduire à des résultats subtilement erronés. Utiliser library au lieu de require renvoie une erreur ici, indiquant clairement que quelque chose ne va pas. C'est bien .

Cela rend également plus difficile le débogage de tous les autres échecs: si vous require un paquet au début de votre script et utilisez ses exportations à la ligne 500, vous obtiendrez un message d'erreur "objet 'truc' non trouvé" à la ligne 500, plutôt qu'une erreur "il n'y a pas de paquet appelé" bla "".

Le seul cas d'utilisation acceptable de require est lorsque sa valeur de retour est immédiatement vérifiée, comme le montrent certaines des autres réponses. C'est 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 paquet.

Plus techniquement, require appelle en fait library en interne (si le package n’est pas déjà attaché - require effectue ainsi une vérification redondante, car library aussi vérifie si le paquet a déjà été chargé). Voici une implémentation simplifiée de require pour illustrer son action:

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 sont d’accord:

Yihui Xie , auteur de {knitr}, {bookdown} et de nombreux autres paquets dit :

Mesdames et Messieurs, je l'ai déjà dit: require () est une mauvaise façon de charger un package R; utilisez library () à la place

Hadley Wickham , auteur de paquets R plus populaires que quiconque, dit

Utilisez library(x) dans les scripts d'analyse de données. […] Vous n'avez jamais besoin d'utiliser require() (requireNamespace() est presque toujours préférable)

39
Konrad Rudolph
?library

et vous allez voir:

library(package) et require(package) chargent le paquet avec le nom package et le mettent dans la liste de recherche. require est conçu pour être utilisé dans d'autres fonctions; il retourne FALSE et donne un avertissement (plutôt qu'une erreur comme le fait library() par défaut) si le package n'existe pas. Les deux fonctions vérifient et mettent à jour la liste des packages actuellement chargés et ne rechargent pas un package déjà chargé. (Si vous souhaitez recharger un tel package, appelez d'abord detach(unload = TRUE) ou unloadNamespace.) Si vous souhaitez charger un package sans le mettre dans la liste de recherche, utilisez requireNamespace.

19
dwstu

Ma théorie initiale sur la différence était que library charge les paquets, qu'ils soient déjà chargés ou non, c'est-à-dire qu'il peut recharger un paquet déjà chargé, alors que require vérifie simplement qu'il est chargé ou le charge si ce n'est pas (donc l'utilisation dans les fonctions qui reposent sur un certain paquet). La documentation réfute cela, cependant, et déclare explicitement qu'aucune fonction ne rechargera un paquet déjà chargé.

7
dsb

Cela semble être la différence sur un paquet déjà chargé. Bien qu'il soit vrai que require et la bibliothèque ne chargent pas le paquet. Library fait beaucoup d'autres choses avant de vérifier et de quitter.

Je recommanderais de supprimer "require" dès le début d'une fonction exécutée 2 fois de toute façon, mais si, pour une raison quelconque, je devais la conserver. nécessite est techniquement un contrôle plus rapide.

microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
 expr    min     lq      mean median     uq        max neval
  req  3.676  5.181  6.596968  5.655  6.177   9456.006 1e+05
  lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05
3
Shape