Resumindo a postagem no blog de Yihui: "Senhoras e senhores, eu já disse isso antes: require () é a maneira errada de carregar um pacote R; use a biblioteca () em vez disso"
De Novo
1
@DanHall ... porque library()falha imediatamente em voz alta, mais cedo e com uma mensagem de erro relevante (se o pacote não estiver instalado ou não puder ser carregado), enquanto require()não gera um erro, retorna silenciosamente FALSE booleano que é jogado fora, e faz com que o código falhar mais tarde e mais enigmaticamente com Error: object “bar” not foundsobre (digamos) linha 175.
SMCI
1
@KonradRudolph: Feito! Obrigado pelo seu feedback.
Marco
Respostas:
86
Além dos bons conselhos já dados, eu acrescentaria o seguinte:
Provavelmente, é melhor evitar o uso, a require()menos que você realmente utilize o valor que ele retorna, por exemplo, em algum loop de verificação de erros, como o fornecido por thierry.
Na maioria dos outros casos, é melhor usar library(), pois isso dará uma mensagem de erro no tempo de carregamento do pacote, se o pacote não estiver disponível. require()falhará sem erro se o pacote não estiver lá. Este é o melhor momento para descobrir se o pacote precisa ser instalado (ou talvez nem exista porque está incorreto). Obter feedback de erro antecipadamente e no momento relevante evitará possíveis dores de cabeça ao rastrear por que o código posterior falha ao tentar usar as rotinas da biblioteca
No entanto, de acordo com a documentação para ambas as funções (acessada colocando a ?antes do nome da função e pressionando enter), requireé usada dentro das funções, pois emite um aviso e continua se o pacote não for encontrado, ao passo que gera um libraryerro.
#richiemorrisroe: Obrigado. Isso significa que, se eu carregar os pacotes necessários no início do meu código R, não importa qual deles escolher?
Marco
6
contanto que você não esteja carregando pacotes dentro de uma função, isso realmente não faz diferença. Carrego todos os meus pacotes usando o require e não sabia qual era a diferença até ler a ajuda depois de ver sua pergunta.
richiemorrisroe
45
A outra razão pela qual uso requireé que isso me impede de me referir a pacotes como libraries, uma prática que leva os cognoscentes à parede. O libraryé o local do diretório em que os pacotes estão.
IRTFM
22
Eles têm diferenças muito relevantes. Não use require, a menos que verifique o valor de retorno (e nesse caso geralmente existem alternativas melhores, por exemplo loadNamespace).
Konrad Rudolph
256
Outro benefício require()é que ele retorna um valor lógico por padrão. TRUEse os pacotes estiverem carregados, FALSEse não estiverem.
> 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
Então você pode usar require()em construções como a abaixo. O que é útil principalmente se você deseja distribuir seu código para a instalação do R, onde os pacotes podem não estar instalados.
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")}}
Você pode embrulhar require()e library()em suppressPackageStartupMessages()para, assim, as mensagens de pacotes de supressão de inicialização, e também usar os parâmetros require(..., quietly=T, warn.conflicts=F)se necessário para manter o silêncio instala.
Em poucas palavras, isso ocorre porque, ao usar require, seu código pode gerar resultados diferentes e errados, sem sinalizar um erro . Isso é raro, mas não hipotético! Considere este código, que gera resultados diferentes, dependendo de se {dplyr} pode ser carregado:
require(dplyr)
x = data.frame(y = seq(100))
y =1
filter(x, y ==1)
Isso pode levar a resultados sutilmente errados. Usar em libraryvez de requiregerar um erro aqui, sinalizando claramente que algo está errado. Isso é bom .
Isso também dificulta a depuração de todas as outras falhas: se você requireempacotar um pacote no início do script e usar suas exportações na linha 500, receberá uma mensagem de erro "objeto 'foo' não encontrado" na linha 500, em vez de um erro "não há pacote chamado 'bla'".
O único caso de uso aceitável de requireé quando seu valor de retorno é verificado imediatamente, como mostram algumas das outras respostas. Esse é um padrão bastante comum, mas mesmo nesses casos é melhor (e recomendado, veja abaixo) separar a verificação de existência e o carregamento do pacote.
Mais tecnicamente, requirena verdade chama libraryinternamente (se o pacote já não estiver anexado - requireportanto, executa uma verificação redundante, porque librarytambém verifica se o pacote já foi carregado). Aqui está uma implementação simplificada de requirepara ilustrar o que ele faz:
Eu apontaria exatamente o mesmo, a menos que você esteja chamando TODAS as funções com a sintaxe class::function, use library()para evitar precisamente isso.
Ghost
19
?library
e você verá:
library(package)e require(package)ambos carregam o pacote com o nome
packagee o colocam na lista de pesquisa. requirefoi projetado para uso dentro de outras funções; ele retorna FALSEe emite um aviso (em vez de um erro como library()ocorre por padrão) se o pacote não existir. Ambas as funções verificam e atualizam a lista de pacotes atualmente carregados e não recarregam um pacote que já esteja carregado. (Se você deseja recarregar esse pacote, ligue detach(unload = TRUE)ou
unloadNamespaceprimeiro.) Se você deseja carregar um pacote sem colocá-lo na lista de pesquisa, use requireNamespace.
Minha teoria inicial sobre a diferença era que librarycarrega os pacotes, se ele já está carregado ou não, ou seja, ele pode recarregar um pacote já carregado, enquanto requireapenas verifica se ele está carregado ou carrega, se não estiver (portanto, o uso em funções que dependem de um determinado pacote). A documentação refuta isso, no entanto, e afirma explicitamente que nenhuma função recarregará um pacote já carregado.
Aqui parece haver a diferença em um pacote já carregado. Embora seja verdade que o exigir e a biblioteca não carregam o pacote. A biblioteca faz muitas outras coisas antes de verificar e sair.
Eu recomendaria remover "require" desde o início de uma função que executa 2mil vezes de qualquer maneira, mas se, por algum motivo, eu precisar mantê-la. exigir é tecnicamente uma verificação mais rápida.
microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times =100000)
Unit: microseconds
expr min lq mean median uq max neval
req 3.6765.1816.5969685.6556.1779456.0061e+05
lib 17.19219.88727.30290720.85222.490255665.8811e+05
Eu argumentaria que esse é um forte motivo para corrigir a implementação library(ambas as funções, como atualmente enviadas com R, são uma grande bagunça).
21418 Konrad Rudolph
@KonradRudolph bem, se alguém vai à biblioteca correção, talvez eles possam também permitem o carregamento pela versão explícita e fazer anexo uma opção argumento
Forma
Sim, concordo plenamente, mas isso mudaria a semântica, não apenas o desempenho. De qualquer forma, o controle de versão nunca funcionará com pacotes no R, infelizmente. Estou trabalhando em um substituto para isso (realmente!). Quanto à conexão, você pode usar loadNamespace, que carrega um pacote e retorna seu espaço para nome, sem anexá-lo.
library()
falha imediatamente em voz alta, mais cedo e com uma mensagem de erro relevante (se o pacote não estiver instalado ou não puder ser carregado), enquantorequire()
não gera um erro, retorna silenciosamente FALSE booleano que é jogado fora, e faz com que o código falhar mais tarde e mais enigmaticamente comError: object “bar” not found
sobre (digamos) linha 175.Respostas:
Além dos bons conselhos já dados, eu acrescentaria o seguinte:
Provavelmente, é melhor evitar o uso, a
require()
menos que você realmente utilize o valor que ele retorna, por exemplo, em algum loop de verificação de erros, como o fornecido por thierry.Na maioria dos outros casos, é melhor usar
library()
, pois isso dará uma mensagem de erro no tempo de carregamento do pacote, se o pacote não estiver disponível.require()
falhará sem erro se o pacote não estiver lá. Este é o melhor momento para descobrir se o pacote precisa ser instalado (ou talvez nem exista porque está incorreto). Obter feedback de erro antecipadamente e no momento relevante evitará possíveis dores de cabeça ao rastrear por que o código posterior falha ao tentar usar as rotinas da bibliotecafonte
Não há muito no trabalho cotidiano.
No entanto, de acordo com a documentação para ambas as funções (acessada colocando a
?
antes do nome da função e pressionando enter),require
é usada dentro das funções, pois emite um aviso e continua se o pacote não for encontrado, ao passo que gera umlibrary
erro.fonte
require
é que isso me impede de me referir a pacotes comolibraries
, uma prática que leva os cognoscentes à parede. Olibrary
é o local do diretório em que os pacotes estão.require
, a menos que verifique o valor de retorno (e nesse caso geralmente existem alternativas melhores, por exemploloadNamespace
).Outro benefício
require()
é que ele retorna um valor lógico por padrão.TRUE
se os pacotes estiverem carregados,FALSE
se não estiverem.Então você pode usar
require()
em construções como a abaixo. O que é útil principalmente se você deseja distribuir seu código para a instalação do R, onde os pacotes podem não estar instalados.fonte
Você pode usar
require()
se quiser instalar pacotes, se e somente se necessário, como:Para vários pacotes, você pode usar
Dicas profissionais:
Quando usado dentro do script, você pode evitar uma tela de diálogo especificando o
repos
parâmetro deinstall.packages()
, comoVocê pode embrulhar
require()
elibrary()
emsuppressPackageStartupMessages()
para, assim, as mensagens de pacotes de supressão de inicialização, e também usar os parâmetrosrequire(..., quietly=T, warn.conflicts=F)
se necessário para manter o silêncio instala.fonte
Sempre use
library
. Nunca 1 usorequire
.( 1 Quase nunca. Talvez .)
Em poucas palavras, isso ocorre porque, ao usar
require
, seu código pode gerar resultados diferentes e errados, sem sinalizar um erro . Isso é raro, mas não hipotético! Considere este código, que gera resultados diferentes, dependendo de se {dplyr} pode ser carregado:Isso pode levar a resultados sutilmente errados. Usar em
library
vez derequire
gerar um erro aqui, sinalizando claramente que algo está errado. Isso é bom .Isso também dificulta a depuração de todas as outras falhas: se você
require
empacotar um pacote no início do script e usar suas exportações na linha 500, receberá uma mensagem de erro "objeto 'foo' não encontrado" na linha 500, em vez de um erro "não há pacote chamado 'bla'".O único caso de uso aceitável de
require
é quando seu valor de retorno é verificado imediatamente, como mostram algumas das outras respostas. Esse é um padrão bastante comum, mas mesmo nesses casos é melhor (e recomendado, veja abaixo) separar a verificação de existência e o carregamento do pacote.Mais tecnicamente,
require
na verdade chamalibrary
internamente (se o pacote já não estiver anexado -require
portanto, executa uma verificação redundante, porquelibrary
também verifica se o pacote já foi carregado). Aqui está uma implementação simplificada derequire
para ilustrar o que ele faz:Desenvolvedores experientes em R concordam:
Yihui Xie , autor de {knitr}, {bookdown} e muitos outros pacotes diz :
Hadley Wickham , autor de pacotes R mais populares do que qualquer outro, diz
fonte
class::function
, uselibrary()
para evitar precisamente isso.e você verá:
fonte
Minha teoria inicial sobre a diferença era que
library
carrega os pacotes, se ele já está carregado ou não, ou seja, ele pode recarregar um pacote já carregado, enquantorequire
apenas verifica se ele está carregado ou carrega, se não estiver (portanto, o uso em funções que dependem de um determinado pacote). A documentação refuta isso, no entanto, e afirma explicitamente que nenhuma função recarregará um pacote já carregado.fonte
Aqui parece haver a diferença em um pacote já carregado. Embora seja verdade que o exigir e a biblioteca não carregam o pacote. A biblioteca faz muitas outras coisas antes de verificar e sair.
Eu recomendaria remover "require" desde o início de uma função que executa 2mil vezes de qualquer maneira, mas se, por algum motivo, eu precisar mantê-la. exigir é tecnicamente uma verificação mais rápida.
fonte
library
(ambas as funções, como atualmente enviadas com R, são uma grande bagunça).loadNamespace
, que carrega um pacote e retorna seu espaço para nome, sem anexá-lo.