Immer benutzen library
. Nie 1 Verwendung require
.
( 1 Fast nie. Vielleicht .)
Kurz gesagt, dies liegt daran, dass require
Ihr Code bei der Verwendung möglicherweise andere, fehlerhafte Ergebnisse liefert, ohne einen Fehler zu signalisieren . Dies ist selten, aber nicht hypothetisch! Betrachten Sie diesen Code, der unterschiedliche Ergebnisse liefert, je nachdem, 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. Die Verwendung von library
anstelle von require
löst hier einen Fehler aus und signalisiert deutlich, dass etwas nicht stimmt. Das ist gut .
Dies erschwert auch das Debuggen aller anderen Fehler: Wenn Sie require
zu Beginn Ihres Skripts ein Paket erstellen und dessen Exporte in Zeile 500 verwenden, wird in Zeile 500 die Fehlermeldung "Objekt 'foo' nicht gefunden" anstelle von " Fehler "Es gibt kein Paket namens 'bla'".
Der einzig akzeptable Anwendungsfall require
ist, wenn der 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), stattdessen die Existenzprüfung und das Laden des Pakets zu trennen.
Technisch gesehen werden require
Anrufe tatsächlich library
intern aufgerufen (wenn das Paket noch nicht angehängt war - require
führt daher eine redundante Prüfung durch, da library
auch geprüft wird, ob das Paket bereits geladen wurde). Hier ist eine vereinfachte Implementierung von, um require
zu veranschaulichen, was es 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 sind sich einig:
Yihui Xie , Autor von {knitr}, {bookdown} und vielen anderen Paketen, sagt :
Meine Damen und Herren, ich habe dies bereits gesagt: require () ist der falsche Weg, um ein R-Paket zu laden; Verwenden Sie stattdessen library ()
Hadley Wickham , Autor beliebterer R-Pakete als jeder andere, sagt
Verwendung library(x)
in Datenanalyseskripten. […] Sie müssen nie verwenden require()
( requireNamespace()
ist fast immer besser)