Quelle est la différence entre require()
y library()
?
Quelle est la différence entre require()
y library()
?
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.
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.
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.
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")
}
}
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.
?library
et vous verrez :
library(package)
yrequire(package)
les deux chargent le paquet avec le nompackage
et le mettre dans la liste de recherche.require
est conçu pour être utilisé à l'intérieur d'autres fonctions ; elle renvoieFALSE
et donne un avertissement (plutôt que plutôt qu'une erreur commelibrary()
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, appelezdetach(unload = TRUE)
ouunloadNamespace
d'abord.) Si vous voulez charger un paquet sans le mettre dans la liste de recherche, utilisezrequireNamespace
.
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é.
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.
3 votes
mail-archive.com/r-devel@stat.math.ethz.ch/msg00301.html
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.
7 votes
Résumé de l'article du blog de @Yihui : " Mesdames et messieurs, je l'ai déjà dit : require() est la mauvaise façon de charger un paquet R ; utilisez plutôt library() ".
1 votes
@DanHall ... parce que
library()
échoue immédiatement de manière bruyante, précoce et avec un message d'erreur pertinent (si le paquet n'est pas installé ou n'a pas pu être chargé), alors querequire()
ne lève pas d'erreur, renvoie juste le booléen FALSE qui est jeté, et fait échouer le code plus tard et de façon plus cryptique avecError: object “bar” not found
à la (disons) ligne 175.0 votes
Bonjour @Marco, cette question est assez populaire et reçoit beaucoup de trafic. Malheureusement, la réponse acceptée est (complètement) erronée dans la mesure où elle contredit les meilleures pratiques communément admises, comme expliqué dans les commentaires et par d'autres réponses, et désinforme les gens. Pourriez-vous prendre en compte les autres réponses et accepter celle qui fournit une explication correcte ? (Étant donné que c'est moi qui vous supplie, je suggère d'accepter la réponse de dww, que j'ai upvoted. C'est la seule réponse, à part la mienne, qui met en avant les sérieux problèmes liés à l'utilisation de
require
.)