Завжди використовуйте library
. Ніколи 1 використання require
.
( 1 Майже ніколи. Можливо .)
У двох словах, це тому, що при використанні require
ваш код може дати різні, помилкові результати, не сигналізуючи про помилку . Це рідко, але не гіпотетично! Розглянемо цей код, який дає різні результати залежно від того, чи можна завантажити {dplyr}:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Це може призвести до невірних результатів. Використовуючи library
замість того, щоб require
кидати тут помилку, чітко сигналізуючи про те, що щось не так. Це добре .
Це також ускладнює налагодження всіх інших відмов: Якщо ви require
розпочали пакунок на початку сценарію і використовуєте його експорт у рядку 500, ви отримаєте повідомлення про помилку «об’єкт foo 'не знайдено» у рядку 500, а не помилка "немає пакета з назвою" bla ".
Єдиний прийнятний випадок використання require
, коли його повернене значення негайно перевіряється, як показують деякі інші відповіді. Це досить поширена модель, але навіть у цих випадках краще (і рекомендується, див. Нижче) замість цього розділити перевірку існування та завантаження пакета.
Більш технічно, require
насправді дзвонить library
внутрішньо (якщо пакет ще не був приєднаний - require
таким чином виконується зайва перевірка, оскільки library
також перевіряється, чи пакет уже завантажений). Ось спрощена реалізація require
для ілюстрації того, що він робить:
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
}
Досвідчені розробники R погоджуються:
Yihui Xie , автор {knitr}, {bookdown} та багатьох інших пакунків, говорить :
Пані, панове, я вже говорив це раніше: вимагати () це неправильний спосіб завантаження пакету R; використовуйте натомість бібліотеку ()
Ходлі Вікхем , автор більш популярних R-пакетів, ніж будь-хто інший
Використання library(x)
в сценаріях аналізу даних. […] Ніколи не потрібно використовувати require()
( requireNamespace()
майже завжди краще)