В чем разница между require()
и library()
?
В чем разница между require() и library()?
Ответ 1
В повседневной работе не так много.
Однако в соответствии с документацией для обеих функций (доступ с помощью ?
перед именем функции и нажатием введите), require
используется внутри функций, поскольку он выдает предупреждение и продолжает, если пакет не найден, тогда как library
выдаст ошибку.
Ответ 2
Еще одно преимущество require()
заключается в том, что оно возвращает логическое значение по умолчанию. TRUE
, если пакеты загружены, FALSE
, если это не так.
> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called 'abc'
> test
[1] FALSE
Таким образом, вы можете использовать require()
в конструкциях, подобных приведенным ниже. Что особенно удобно, если вы хотите распространять свой код для нашей установки R, были бы не установлены пакеты.
if(require("lme4")){
print("lme4 is loaded correctly")
} else {
print("trying to install lme4")
install.packages("lme4")
if(require(lme4)){
print("lme4 installed and loaded")
} else {
stop("could not install lme4")
}
}
Ответ 3
Вы можете использовать require()
, если вы хотите установить пакеты, если и только при необходимости, например:
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
Для нескольких пакетов вы можете использовать
for (package in c('<package1>', '<package2>')) {
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
}
Советы профессионала:
-
При использовании внутри script вы можете избежать диалогового экрана, указав параметр
repos
install.packages()
, напримерinstall.packages(package, repos="http://cran.us.r-project.org")
-
Вы можете обернуть
require()
иlibrary()
вsuppressPackageStartupMessages()
, чтобы подавить сообщения о запуске пакета, а также использовать параметрыrequire(..., quietly=T, warn.conflicts=F)
, если это необходимо, чтобы установка была спокойной.
Ответ 4
В дополнение к уже предоставленному хорошему совету, я бы добавил:
Вероятно, лучше избегать использования require()
, если вы фактически не будете использовать возвращаемое им значение, например, в каком-то цикле проверки ошибок, например, заданном thierry.
В большинстве других случаев лучше использовать library()
, потому что это даст сообщение об ошибке при загрузке пакета, если пакет недоступен. require()
будет просто сбой без ошибки, если пакет отсутствует. Это лучшее время, чтобы узнать, должен ли пакет быть установлен (или, возможно, даже не существует, потому что он не соответствует действительности). Получение обратной связи с обратной связью на раннем этапе и в соответствующее время позволит избежать возможных головных болей с отслеживанием того, почему более поздний код выходит из строя, когда он пытается использовать библиотечные процедуры
Ответ 5
?library
и вы увидите:
library(package)
иrequire(package)
загружают пакет с именемpackage
и поместите его в список поиска.require
предназначен для использования внутри других функций; он возвращаетFALSE
и дает предупреждение (скорее чем ошибка по умолчаниюlibrary()
), если пакет не существовать. Обе функции проверяют и обновляют список загружаемых в настоящее время пакетов и не перезагружать пакет, который уже загружен. (Если ты хотите перезагрузить такой пакет, вызовитеdetach(unload = TRUE)
илиunloadNamespace
.) Если вы хотите загрузить пакет без ввода в списке поиска используйтеrequireNamespace
.
Ответ 6
Всегда используйте 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 not found "в строке 500, а не ошибка", нет пакета под названием "бла".
Единственный приемлемый случай 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} и многих других пакетов говорит:
Дамы и господа, я сказал это раньше: require() - неправильный способ загрузки R-пакета; вместо этого используйте library()
Хэдли Уикхэм, автор более популярных пакетов R, чем кто-либо другой, говорит
Используйте
library(x)
в сценариях анализа данных. [...] Вам не нужно использоватьrequire()
(requireNamespace()
почти всегда лучше)
Ответ 7
Моя первоначальная теория о различии заключалась в том, что library
загружает пакеты независимо от того, загружена она или нет, т.е. может перезагрузить уже загруженный пакет, а require
просто проверяет, что он загружен, или загружает его, если он (таким образом, использование в функциях, которые полагаются на определенный пакет). Однако документация опровергает это и явно указывает, что ни одна из функций не перезагрузит уже загруженный пакет.
Ответ 8
Здесь, похоже, разница в уже загруженном пакете. Хотя верно, что оба требуют, и библиотека не загружает пакет. Библиотека выполняет множество других вещей, прежде чем проверяет и завершает работу.
Я бы рекомендовал удалить "require" с начала функции, запущенной в 2 раза в любом случае, но если по какой-то причине мне нужно было ее сохранить. требуют технически более быстрой проверки.
microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
expr min lq mean median uq max neval
req 3.676 5.181 6.596968 5.655 6.177 9456.006 1e+05
lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05
Ответ 9
require()
загружает все дополнительные пакеты