write - r studio
¿Cuál es la diferencia entre require() y library()? (9)
¿Cuál es la diferencia entre require()
y library()
?
Siempre usa la library
. Nunca 1 uso require
.
( 1 Casi nunca. Tal vez .)
En pocas palabras, esto se debe a que, al usar require
, su código puede producir resultados diferentes y erróneos, sin señalar 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 llevar a resultados sutilmente erróneos. El uso de la library
lugar de require
arroja un error aquí, lo que indica claramente que algo está mal. Esto es bueno
También dificulta la depuración de todas las demás fallas: si require
un paquete al inicio de su script 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 ningún paquete llamado ''bla''".
El único caso de uso aceptable de require
es cuando su valor de retorno se verifica inmediatamente, como muestran algunas de las otras respuestas. Este es un patrón bastante común, pero incluso en estos casos es mejor (y se recomienda, ver más abajo) separar la verificación de existencia y la carga del paquete.
Más técnicamente, realmente require
llamadas a la library
internamente (si el paquete no estaba ya adjunto, require
una verificación redundante, ya que la 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 de R con experiencia están de acuerdo:
Yihui Xie , autor de {knitr}, {bookdown} y muchos otros paquetes says :
Señoras y señores, he dicho esto antes: require () es la forma incorrecta de cargar un paquete R; usa library () en su lugar
Hadley Wickham , autor de paquetes de R más populares que nadie, dice
Utilice la
library(x)
en los scripts de análisis de datos. [...] Nunca necesitas usarrequire()
(requireNamespace()
casi siempre es mejor)
Además de los buenos consejos ya dados, agregaría esto:
Probablemente sea mejor evitar el uso de require()
menos que realmente esté utilizando el valor que devuelve, por ejemplo, en algún bucle de comprobación de errores, como el que proporciona Thierry.
En la mayoría de los otros casos, es mejor usar library()
, ya que esto mostrará un mensaje de error en el momento de carga del paquete si el paquete no está disponible. require()
solo fallará sin un error si el paquete no está allí. Este es el mejor momento para averiguar si el paquete necesita ser instalado (o tal vez ni siquiera existe porque está mal escrito). Obtener retroalimentación de error temprano y en el momento relevante evitará posibles dolores de cabeza al rastrear por qué el código posterior falla cuando intenta usar rutinas de la biblioteca
Aquí parece ser la diferencia en un paquete ya cargado. Si bien es cierto que ambos requieren y la biblioteca no carga el paquete. La biblioteca hace muchas otras cosas antes de revisar y salir.
Recomendaría eliminar "require" desde el principio de una función que se ejecuta 2mil veces, pero si, por alguna razón, necesitaba mantenerla. Requerir es técnicamente una verificación más rápida.
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
Mi teoría inicial acerca de la diferencia era que la library
carga los paquetes si ya está cargado o no, es decir, puede volver a cargar un paquete ya cargado, mientras require
solo require
que se cargue, o lo carga si no lo está (por lo tanto, el uso en funciones que dependen de un determinado paquete). Sin embargo, la documentación refuta esto y establece explícitamente que ninguna de las funciones volverá a cargar un paquete ya cargado.
No hay mucho de uno en el trabajo diario.
Sin embargo, de acuerdo con la documentación de ambas funciones (a la que se accede ingresando un ?
Antes del nombre de la función y presionando enter), require
se usa dentro de las funciones, ya que genera una advertencia y continúa si no se encuentra el paquete, mientras que la library
arrojará un error .
Otro beneficio de require()
es que devuelve un valor lógico por defecto. TRUE
si los paquetes están cargados, FALSE
si no lo está.
> 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
Por lo tanto, puede utilizar require()
en construcciones como la que se muestra a continuación. Lo que es especialmente útil si desea distribuir su código a nuestra instalación de R donde los paquetes podrían no 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")
}
}
Puede usar require()
si desea instalar paquetes si y solo si es necesario, como:
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
Para paquetes múltiples puedes usar
for (package in c(''<package1>'', ''<package2>'')) {
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
}
Consejos profesionales:
Cuando se utiliza dentro del script, puede evitar una pantalla de diálogo especificando el parámetro
repos
deinstall.packages()
, comoinstall.packages(package, repos="http://cran.us.r-project.org")
Puede ajustar
require()
ylibrary()
ensuppressPackageStartupMessages()
para, también, suprimir los mensajes de inicio de paquetes, y también usar los parámetrosrequire(..., quietly=T, warn.conflicts=F)
si es necesario para mantener las instalaciones tranquilo.
require()
carga todos los paquetes adicionales
?library
y tu verás:
library(package)
yrequire(package)
cargan el paquete con el nombre delpackage
y lo ponen en la lista de búsqueda.require
está diseñado para ser usado dentro de otras funciones; devuelveFALSE
y da una advertencia (en lugar de un error, como hace lalibrary()
por defecto) si el paquete no existe. Ambas funciones verifican y actualizan la lista de paquetes cargados actualmente y no vuelven a cargar un paquete que ya está cargado. (Si desea volver a cargar tal paquete, llame primero aunloadNamespace
(unloadNamespace
detach(unload = TRUE)
ounloadNamespace
). Si desea cargar un paquete sin ponerlo en la lista de búsqueda, userequireNamespace
.