Всегда используйте 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()
почти всегда лучше)