Всегда используйте 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 согласны:
Ихуэй Се , автор {knitr}, {bookdown} и многих других пакетов говорит :
Дамы и господа, я уже говорил это раньше: require () - неправильный способ загрузки пакета R; используйте библиотеку () вместо
Хэдли Уикхэм , автор более популярных пакетов R, чем кто-либо еще, говорит
Использовать library(x)
в скриптах анализа данных. [...]
Вам никогда не нужно использовать require()
(requireNamespace()
почти всегда лучше)