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


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


434
2018-04-08 13:09


origine


Réponses:


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

Cependant, selon la documentation des deux fonctions (accessible en mettant un ? avant le nom de la fonction et en appuyant sur enter), require est utilisé à l'intérieur des fonctions, car il génère un avertissement et continue si le paquet n'est pas trouvé, alors que library va jeter une erreur.


281
2018-04-08 13:14



Un autre avantage de require() est qu'il renvoie une valeur logique par défaut. TRUE si les paquets 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

Donc vous pouvez utiliser require() dans des constructions comme celle ci-dessous. Ce qui est surtout pratique si vous voulez distribuer votre code à notre installation R, les paquets 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")
    }
}

218
2018-04-08 21:52



Vous pouvez utiliser require() Si vous souhaitez installer des packages uniquement si nécessaire, par exemple:

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

Pour plusieurs paquets, 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:

  • Utilisé à l’intérieur du script, vous pouvez éviter un écran de dialogue en spécifiant le repos paramètre de install.packages(), tel que

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


52
2017-08-20 15:57



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 En fait, vous utiliserez la valeur renvoyée, par exemple, dans une boucle de vérification d'erreur telle que celle fournie 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 le paquet n'est pas disponible. require() va juste échouer 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 pas parce qu'il a mal orthographié). Obtenir des commentaires d'erreur tôt et au moment opportun permettra d'éviter les maux de tête possibles avec la recherche des raisons pour lesquelles le code échoue plus tard lorsqu'il tente d'utiliser les routines de la bibliothèque.


43
2018-02-10 01:24



?library

et vous allez voir:

library(package) et require(package) tous deux charger le paquet avec le nom    package et mettez-le sur la liste de recherche. require est conçu pour une utilisation   à l'intérieur d'autres fonctions; ça revient FALSE et donne un avertissement (plutôt   qu'une erreur comme library() fait par défaut) si le paquet ne   exister. Les deux fonctions vérifient et mettent à jour la liste des   paquets et ne recharge pas un paquet déjà chargé. (Si vous   vouloir recharger un tel paquet, appelez detach(unload = TRUE) ou    unloadNamespace premier.) Si vous voulez charger un paquet sans mettre   sur la liste de recherche, utilisez requireNamespace.


15
2017-12-15 15:41



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’ils peuvent recharger un paquet déjà chargé, require vérifie simplement qu'il est chargé ou le charge s'il ne l'est pas (donc l'utilisation dans des fonctions qui dépendent d'un certain paquet). La documentation réfute cela, cependant, et déclare explicitement qu'aucune des deux fonctions ne rechargera un paquet déjà chargé.


7
2017-10-09 15:35



Ici semble être la différence sur un paquet déjà chargé. Même s'il est vrai que require et library ne chargent pas le package. Bibliothèque fait beaucoup d'autres choses avant de vérifier et de quitter.

Je recommanderais de supprimer "require" au début d'une fonction fonctionnant 2mil de toute façon, mais si, pour une raison quelconque, j'avais besoin de le garder. require 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

2
2018-02-22 14:34



Toujours utiliser library. Jamais1 utilisation require.

(1 Presque jamais. Peut être.)

En un mot, c'est parce que, en utilisant require, votre code pourrait donner des résultats différents et erronés, sans signaler une 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 erronés. En utilisant library au lieu de require jette une erreur ici, signalant clairement que quelque chose ne va pas. C'est bon.

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 "object 'foo' not found" à 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 commun mais même dans ces cas, il est préférable (et recommandé, voir ci-dessous) de séparer à la place le contrôle d'existence et le chargement du paquet.

Plus techniquement, require appelle en réalité library en interne (si le package n'était pas déjà joint - require effectue donc un contrôle redondant, car library  aussi vérifie si le paquet 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 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 le mauvais moyen de charger un paquet R; utilisez plutôt library ()

Hadley Wickham, auteur de paquets 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() est presque toujours mieux)


1
2017-07-10 11:00



require() charge tous les paquets supplémentaires


-8
2017-09-05 20:21