Usa sempre library
. Mai 1 utilizzo require
.
( 1 Quasi mai. Forse .)
In breve, ciò è dovuto al fatto che, durante l'utilizzo require
, il codice potrebbe produrre risultati diversi, errati, senza segnalare un errore . Questo è raro ma non ipotetico! Considera questo codice, che produce risultati diversi a seconda che {dplyr} possa essere caricato:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Questo può portare a risultati leggermente sbagliati. Utilizzando library
invece di require
generare un errore qui, segnalando chiaramente che qualcosa non va. Questo è un bene .
Inoltre, rende più difficile il debug di tutti gli altri errori: se si crea require
un pacchetto all'inizio dello script e si utilizzano le sue esportazioni nella riga 500, nella riga 500 verrà visualizzato un messaggio di errore "oggetto" non trovato "nella riga 500 errore "non esiste un pacchetto chiamato 'bla'".
L'unico caso d'uso accettabile di require
è quando il suo valore di ritorno viene immediatamente verificato, come mostrano alcune delle altre risposte. Questo è un modello abbastanza comune ma anche in questi casi è meglio (e consigliato, vedi sotto) invece separare il controllo di esistenza e il caricamento del pacchetto.
Più tecnicamente, in require
realtà chiama library
internamente (se il pacchetto non era già collegato, require
quindi esegue un controllo ridondante, perché controlla library
anche se il pacchetto è già stato caricato). Ecco un'implementazione semplificata di require
per illustrare cosa fa:
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
}
Gli sviluppatori R esperti concordano:
Yihui Xie , autore di {knitr}, {bookdown} e molti altri pacchetti afferma :
Onorevoli colleghi, l'ho già detto prima: requisito () è il modo sbagliato di caricare un pacchetto R; utilizzare invece library ()
Hadley Wickham , autore di pacchetti R più popolari di chiunque altro, afferma
Utilizzare library(x)
negli script di analisi dei dati. […] Non hai mai bisogno di usare require()
( requireNamespace()
è quasi sempre meglio)