660 votes

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

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

3 votes

7 votes

Ajout d'un lien vers l'article du blog de @Yihui, à moins qu'il ne veuille en publier une version en tant que réponse. yihui.name/fr/2014/07/library-vs-require

0 votes

J'utilise habituellement require si je veux qu'une valeur logique soit retournée après le chargement du paquet.

383voto

richiemorrisroe Points 2448

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

Cependant, selon la documentation des deux fonctions (auxquelles on accède en plaçant un bouton ? devant le nom de la fonction et en appuyant sur la touche Entrée), require est utilisé à l'intérieur des fonctions, car il émet un avertissement et continue si le paquet n'est pas trouvé, alors que library entraînera une erreur.

2 votes

richiemorrisroe : Merci. Cela signifie-t-il que si je charge les paquets dont j'ai besoin au tout début de mon code R, cela n'a pas d'importance de savoir lequel je choisis ?

7 votes

Tant que vous ne chargez pas de paquets à l'intérieur d'une fonction, cela ne fait aucune différence. Je charge tous mes paquets en utilisant require, et je ne savais pas quelle était la différence jusqu'à ce que je lise l'aide après avoir vu votre question.

47 votes

L'autre raison pour laquelle j'utilise require c'est que cela m'empêche de faire référence aux paquets en tant que libraries une pratique qui fait bondir les spécialistes de la recherche. Le site library est l'emplacement du répertoire où se trouvent les paquets.

275voto

Thierry Points 6246

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

Vous pouvez donc utiliser require() dans des constructions comme celle qui suit. Ce qui est principalement pratique si vous voulez distribuer votre code à notre installation R où 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")
    }
}

77voto

Daniel Sparing Points 816

Vous pouvez utiliser require() si vous souhaitez installer des paquets si et seulement 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 de pro :

  • Lorsqu'il est utilisé à l'intérieur du script, vous pouvez éviter un écran de dialogue en spécifiant l'option repos paramètre de install.packages() comme

    install.packages(package, repos="http://cran.us.r-project.org")
  • Vous pouvez envelopper require() y library() sur suppressPackageStartupMessages() pour, eh 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 que l'installation soit silencieuse.

21voto

dwstu Points 117
?library

et vous verrez :

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

11voto

dsb Points 101

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 s'il ne l'est pas (d'où l'utilisation dans les fonctions qui dépendent d'un certain paquet). La documentation réfute cependant cette affirmation et indique explicitement qu'aucune des deux fonctions ne rechargera un paquet déjà chargé.

21 votes

C'est intéressant, mais ce n'est pas vraiment une réponse à la question ... ?

1 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X