В чем разница между require () и library ()? - PullRequest
503 голосов
/ 08 апреля 2011

В чем разница между require() и library()?

Ответы [ 8 ]

331 голосов
/ 08 апреля 2011

В повседневной работе не так много.

Однако, согласно документации для обеих функций (доступ к которым осуществляется путем ввода ? перед именем функции и нажатием Enter), require используется внутрифункционирует, поскольку выводит предупреждение и продолжается, если пакет не найден, тогда как library выдаст ошибку.

243 голосов
/ 09 апреля 2011

Еще одним преимуществом 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")
    }
}
63 голосов
/ 20 августа 2014

Вы можете использовать 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)
    }
}

Советы профессионалам:

  • При использовании внутри скрипта вы можете избежать диалогового экрана, указав параметр repos для install.packages(), например

    install.packages(package, repos="http://cran.us.r-project.org")
    
  • Вы можете обернуть require() и library() в suppressPackageStartupMessages(), чтобы, в общем, подавить сообщения о запуске пакета, а также использовать параметры require(..., quietly=T, warn.conflicts=F), если необходимо, чтобы установки оставались тихими.

56 голосов
/ 10 февраля 2015

В дополнение к хорошему совету, который я уже дал, я бы добавил:

Вероятно, лучше избегать использования require() , если только вы не будете использовать значение, которое оно возвращает, например, в некотором цикле проверки ошибок, например, заданном thierry.

В большинстве других случаев лучше использовать library(), потому что это даст сообщение об ошибке во время загрузки пакета, если пакет недоступен. require() просто потерпит неудачу без ошибки, если пакет не найден. Это лучшее время, чтобы узнать, должен ли пакет быть установлен (или, возможно, даже не существует, потому что он написан неправильно). Получение сообщений об ошибках на ранних этапах и в соответствующее время позволит избежать возможных проблем с отслеживанием того, почему более поздний код завершается ошибкой при попытке использовать библиотечные процедуры

36 голосов
/ 10 июля 2018

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

19 голосов
/ 15 декабря 2013
?library

и вы увидите:

library(package) и require(package) и загрузите пакет с именем package и поместите его в список поиска.require предназначен для использования внутри других функций;он возвращает FALSE и выдает предупреждение (а не ошибку, как library() по умолчанию), если пакет не существует.Обе функции проверяют и обновляют список загруженных в данный момент пакетов и не перезагружают уже загруженный пакет.(Если вы хотите перезагрузить такой пакет, сначала наберите detach(unload = TRUE) или unloadNamespace.) Если вы хотите загрузить пакет, не помещая его в список поиска, используйте requireNamespace.

7 голосов
/ 09 октября 2013

Моя первоначальная теория о разнице заключалась в том, что library загружает пакеты независимо от того, загружен он или нет, то есть может перезагрузить уже загруженный пакет, тогда как require просто проверяет, загружен ли он, или загружает его, если он нет (таким образом, использование в функциях, которые полагаются на определенный пакет). Однако в документации это опровергается и прямо указывается, что ни одна из функций не перезагрузит уже загруженный пакет.

3 голосов
/ 22 февраля 2016

Здесь, похоже, разница в уже загруженном пакете. Хотя это правда, что и require, и library не загружают пакет. Библиотека делает много других вещей, прежде чем проверять и выходить.

Я бы порекомендовал убрать «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
...