Zawsze używaj library
. Nigdy nie używaj 1require
.
( 1 Prawie nigdy. Może .)
Krótko mówiąc, dzieje się tak dlatego, że podczas używania require
kod może dawać różne, błędne wyniki, bez sygnalizowania błędu . To rzadkie, ale nie hipotetyczne! Rozważ ten kod, który daje różne wyniki w zależności od tego, czy można załadować {dplyr}:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Może to prowadzić do subtelnie błędnych wyników. Użycie library
zamiast require
generuje tutaj błąd, wyraźnie sygnalizując, że coś jest nie tak. To jest dobre .
Utrudnia to także debugowanie wszystkich innych awarii: jeśli ty require
na początku skryptu jest pakiet i używa się jego eksportu w wierszu 500, w wierszu 500 pojawi się komunikat o błędzie „nie znaleziono obiektu foo” błąd „nie ma pakietu o nazwie„ bla ””.
Jedyny dopuszczalny przypadek użycia require
jest natychmiastowe sprawdzenie jego wartości zwracanej, jak pokazują niektóre inne odpowiedzi. Jest to dość powszechny wzorzec, ale nawet w tych przypadkach lepiej (i zalecane, patrz poniżej) zamiast oddzielić kontrolę istnienia i ładowanie pakietu.
Mówiąc bardziej technicznie, require
faktycznie wywołuje library
wewnętrznie (jeśli pakiet nie został jeszcze dołączony - w require
ten sposób przeprowadza kontrolę nadmiarową, ponieważ sprawdza library
również , czy pakiet został już załadowany). Oto uproszczona implementacja require
ilustrująca to, co robi:
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
}
Doświadczeni programiści R zgadzają się:
Yihui Xie , autor {knitr}, {bookdown} i wielu innych pakietów mówi :
Panie i panowie! Powiedziałem to wcześniej: wymagany () jest złym sposobem ładowania pakietu R. zamiast tego użyj biblioteki ()
Hadley Wickham , autor bardziej popularnych pakietów R niż ktokolwiek inny, mówi
Użyj library(x)
w skryptach analizy danych. […] Nigdy nie musisz używać require()
( requireNamespace()
prawie zawsze jest lepszy)