673 Stimmen

Was ist der Unterschied zwischen require() und library()?

Was ist der Unterschied zwischen require() y library() ?

388voto

richiemorrisroe Punkte 9071

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.

280voto

Thierry Punkte 17544

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")
    }
}

144voto

dww Punkte 28691

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

95voto

Konrad Rudolph Punkte 503837

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 verwenden require() ( requireNamespace() ist fast immer besser)

21voto

dwstu Punkte 809
?library

und Sie werden sehen:

library(package) y require(package) laden beide das Paket mit dem Namen package und setzen Sie es auf die Suchliste. require ist konzipiert für die Verwendung innerhalb anderer Funktionen; sie liefert FALSE und gibt eine Warnung (eher als einen Fehler wie library() 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 Sie detach(unload = TRUE) oder unloadNamespace erstens). Wenn Sie ein Paket laden wollen, ohne es in die auf die Suchliste zu setzen, verwenden Sie requireNamespace .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X