Siempre uso library
. Nunca 1 uso require
.
( 1 Casi nunca. Quizás .)
En pocas palabras, esto se debe a que, cuando se usa require
, su código puede producir resultados diferentes y erróneos, sin indicar un error . ¡Esto es raro pero no hipotético! Considere este código, que produce resultados diferentes dependiendo de si se puede cargar {dplyr}:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Esto puede conducir a resultados sutilmente incorrectos. Usar en library
lugar de require
arroja un error aquí, indicando claramente que algo está mal. Esto es bueno .
También dificulta la depuración de todas las demás fallas: si require
utiliza un paquete al comienzo de su secuencia de comandos y utiliza sus exportaciones en la línea 500, recibirá un mensaje de error "objeto 'foo' no encontrado" en la línea 500, en lugar de un error "no hay paquete llamado 'bla'".
El único caso de uso aceptable require
es cuando su valor de retorno se verifica de inmediato, como muestran algunas de las otras respuestas. Este es un patrón bastante común, pero incluso en estos casos es mejor (y recomendado, ver más abajo) separar la verificación de existencia y la carga del paquete.
Más técnicamente, en require
realidad llama library
internamente (si el paquete ya no estaba adjunto, por lo require
tanto, realiza una verificación redundante, porque library
también verifica si el paquete ya estaba cargado). Aquí hay una implementación simplificada de require
para ilustrar lo que hace:
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
}
Los desarrolladores experimentados de R están de acuerdo:
Yihui Xie , autor de {knitr}, {bookdown} y muchos otros paquetes dice :
Damas y caballeros, he dicho esto antes: require () es la forma incorrecta de cargar un paquete R; use library () en su lugar
Hadley Wickham , autor de paquetes R más populares que nadie, dice
Uso library(x)
en scripts de análisis de datos. […] Nunca necesitas usar require()
( requireNamespace()
casi siempre es mejor)