Was ist der Unterschied zwischen require()
y library()
?
Antworten
Zu viele Anzeigen?Davon gibt es im Arbeitsalltag nicht viel.
Laut der Dokumentation für beide Funktionen (die mit einem ?
vor dem Funktionsnamen und Drücken der Eingabetaste), require
wird innerhalb von Funktionen verwendet, da es eine Warnung ausgibt und fortfährt, wenn das Paket nicht gefunden wird, während library
wird einen Fehler auslösen.
Ein weiterer Vorteil von require()
ist, dass er standardmäßig einen logischen Wert zurückgibt. TRUE
wenn die Pakete geladen sind, FALSE
wenn es nicht der Fall ist.
> 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
Sie können also verwenden require()
in Konstruktionen wie der folgenden. Das ist vor allem dann praktisch, wenn Sie Ihren Code an unsere R-Installation weitergeben wollen, wo möglicherweise keine Pakete installiert sind.
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")
}
}
Zusätzlich zu den guten Ratschlägen, die bereits gegeben wurden, möchte ich Folgendes hinzufügen:
Es ist wahrscheinlich am besten, die Verwendung von require()
es sei denn, Sie werden den zurückgegebenen Wert z. B. in einer Fehlerprüfungsschleife wie der von thierry angegebenen verwenden.
In den meisten anderen Fällen ist es besser, die library()
, da dies beim Laden des Pakets eine Fehlermeldung auslöst, wenn das Paket nicht verfügbar ist. require()
schlägt einfach ohne Fehler fehl, wenn das Paket nicht vorhanden ist. Dies ist der beste Zeitpunkt, um herauszufinden, ob das Paket installiert werden muss (oder ob es vielleicht gar nicht existiert, weil es falsch geschrieben ist). Eine frühzeitige und rechtzeitige Fehlerrückmeldung vermeidet mögliche Kopfschmerzen bei der Suche nach den Gründen, warum späterer Code beim Versuch, Bibliotheksroutinen zu verwenden, fehlschlägt
Verwenden Sie immer library
. Verwenden Sie niemals require
.
tl;dr: require
verstößt gegen eine der grundlegenden Regeln für robuste Softwaresysteme: vorzeitig scheitern .
Kurz gesagt liegt dies daran, dass bei der Verwendung von require
kann Ihr Code zu anderen, fehlerhaften Ergebnissen führen, ohne einen Fehler zu melden . Dies ist zwar selten, aber nicht hypothetisch! Betrachten Sie diesen Code, der führt zu unterschiedlichen Ergebnissen abhängig davon, ob {dplyr} geladen werden kann:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Dies kann zu subtil falschen Ergebnissen führen. Verwendung von library
anstelle von require
gibt hier einen Fehler aus und signalisiert damit deutlich, dass etwas nicht stimmt. Das ist gut .
Es erschwert auch die Fehlersuche bei allen anderen Fehlern: Wenn Sie require
ein Paket am Anfang Ihres Skripts und verwenden Sie dessen Exporte in Zeile 500, erhalten Sie die Fehlermeldung "Objekt 'foo' nicht gefunden" in Zeile 500 und nicht den Fehler "Es gibt kein Paket namens 'bla'".
Der einzige akzeptable Anwendungsfall von require
ist, wenn sein Rückgabewert sofort überprüft wird, wie einige der anderen Antworten zeigen. Dies ist ein ziemlich häufiges Muster, aber selbst in diesen Fällen ist es besser (und empfohlen, siehe unten), die Existenzprüfung und das Laden des Pakets zu trennen. Das heißt: Verwenden Sie requireNamespace
anstelle von require
in diesen Fällen.
Mehr technisch, require
ruft tatsächlich library
intern (wenn das Paket nicht bereits angehängt war -) require
führt somit eine redundante Prüfung durch, denn library
également prüft, ob das Paket bereits geladen wurde). Hier ist eine vereinfachte Implementierung von require
um zu veranschaulichen, was sie tut:
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
}
Erfahrene R-Entwickler stimmen dem zu:
Yihui Xie , Autor von {knitr}, {bookdown} und vielen anderen Paketen sagt :
Meine Damen und Herren, ich habe es schon einmal gesagt: require() ist der falsche Weg, um ein R-Paket zu laden; verwenden Sie stattdessen library()
Hadley Wickham , Autor von mehr populären R-Paketen als jeder andere, sagt
Utilice
library(x)
in Skripten zur Datenanalyse. [ ] Sie brauchen nie zu verwendenrequire()
(requireNamespace()
ist fast immer besser)
?library
und Sie werden sehen:
library(package)
yrequire(package)
laden beide das Paket mit dem Namenpackage
und setzen Sie es auf die Suchliste.require
ist konzipiert für die Verwendung innerhalb anderer Funktionen; sie liefertFALSE
und gibt eine Warnung (eher als einen Fehler wielibrary()
standardmäßig), wenn das Paket nicht existiert. Beide Funktionen prüfen und aktualisieren die Liste der aktuell geladenen Pakete und laden ein bereits geladenes Paket nicht neu. (Wenn Sie ein solches Paket neu laden wollen, rufen Siedetach(unload = TRUE)
oderunloadNamespace
erstens). Wenn Sie ein Paket laden wollen, ohne es in die auf die Suchliste zu setzen, verwenden SierequireNamespace
.
- See previous answers
- Weitere Antworten anzeigen