Sempre use library
. Nunca 1 uso require
.
( 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:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Isso pode levar a resultados sutilmente errados. Usar em library
vez de require
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 chama library
internamente (se o pacote já não estiver anexado - require
portanto, executa uma verificação redundante, porque library
também verifica se o pacote já foi carregado). Aqui está uma implementação simplificada de require
para ilustrar o que ele faz:
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
}
Desenvolvedores experientes em R concordam:
Yihui Xie , autor de {knitr}, {bookdown} e muitos outros pacotes diz :
Senhoras e Senhores Deputados, eu já disse isso antes: require () é a maneira errada de carregar um pacote R; use library ()
Hadley Wickham , autor de pacotes R mais populares do que qualquer outro, diz
Use library(x)
em scripts de análise de dados. [...] Você nunca precisa usar require()
( requireNamespace()
quase sempre é melhor)