Immer benutzen library. Nie 1 Verwendung require.
( 1 Fast nie. Vielleicht .)
Kurz gesagt, dies liegt daran, dass requireIhr 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 libraryanstelle von requirelö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 requirezu 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 requireist, 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 requireAnrufe tatsächlich libraryintern aufgerufen (wenn das Paket noch nicht angehängt war - requirefü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 requirezu 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)