your write test studio programming para paquetes organize mexico language how create code and r packages

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 usar require() ( 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 de install.packages() , como

    install.packages(package, repos="http://cran.us.r-project.org")

  • Puede ajustar require() y library() en suppressPackageStartupMessages() para, también, suprimir los mensajes de inicio de paquetes, y también usar los parámetros require(..., 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) y require(package) cargan el paquete con el nombre del package y lo ponen en la lista de búsqueda. require está diseñado para ser usado dentro de otras funciones; devuelve FALSE y da una advertencia (en lugar de un error, como hace la library() 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 a unloadNamespace ( unloadNamespace detach(unload = TRUE) o unloadNamespace ). Si desea cargar un paquete sin ponerlo en la lista de búsqueda, use requireNamespace .