Cargue varios paquetes a la vez

174

¿Cómo puedo cargar un montón de paquetes a la vez sin volver a escribir el comando require una y otra vez? He intentado tres enfoques, todos los cuales se bloquean y se queman.

Básicamente, quiero proporcionar un vector de nombres de paquetes a una función que los cargará.

x<-c("plyr", "psych", "tm")

require(x)
lapply(x, require)
do.call("require", x)
Tyler Rinker
fuente

Respuestas:

251

Varias permutaciones de las funciones propuestas funcionan, pero solo si especifica el character.onlyargumento a ser TRUE. Ejemplo rápido:

lapply(x, require, character.only = TRUE)
daroczig
fuente
@Tommy & daroczig - Genial. Esa es una solución mucho más limpia. Dejaré el mío solo para la posteridad, y por lo que muestra sobre por qué los intentos del OP no funcionaron.
Josh O'Brien
44
Puede aprovechar la coincidencia parcial de caracteres y salirse con lapply (x, require, ch = T) o incluso lapply (x, require, c = T)
Dason
@daroczig Este código carga los paquetes, pero ¿por qué da los siguientes mensajes de advertencia? 1: En la biblioteca (paquete, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,: no hay ningún paquete llamado 'x' 2: En if (! loaded) {: la condición tiene una longitud> 1 y solo se usará el primer elemento
Anusha
@Anusha: No tengo idea de cajero automático, ¿qué tienes en tu x?
daroczig 01 de
23
Sé amable si R :: base agregó este lapplytruco nativo a library(). Sé genial para poder decir:library(c("plyr", "umx"))
tim
58

El paquete CRAN pacman que mantengo (creado con Dason Kurkiewicz) puede lograr esto:

Entonces el usuario podría hacer:

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 

y si falta el paquete, p_loadlo descargará de CRAN o Bioconductor.

Tyler Rinker
fuente
77
+1! ¿Por qué elegiste el nombre corto p_load? Un nombre más descriptivo como load_packageshace que la intención de la función sea más clara.
Paul Hiemstra
19
Porque la p significa paquete. Todas las funciones del paquete que son útiles y exportadas comienzan con p_. Además, tendemos a usar un poco la biblioteca y eso son 7 caracteres adicionales. 7 caracteres x ~ 1000000 usos de por vida de la función x .5 segundos por carácter = 3500000 segundos. Eso es 58333.33 minutos, 972.2222 horas o 40.50926 días de la vida de un programador que les hemos devuelto :-) En cualquier caso, nuestro objetivo es llegar a CRAN antes del 1 de febrero
Tyler Rinker el
3
Aproximadamente un año tarde, pero finalmente nos presentamos a CRAN. Debería estar despierto en unos días. @trinker (o yo) asegúrese de modificar esto una vez que se haga público.
Dason
55
@ Tyler Sé que llego años tarde, pero creo que su justificación para el p_prefijo es bastante dudosa. Si el problema es la brevedad, elimine el p_prefijo por completo. De hecho, tener tales prefijos generalmente se desaconseja en otros idiomas por buenas razones (le he dicho a Hadley lo mismo con respecto a sus fct_tonterías en los forcats). Esto es especialmente cierto ya que el uso previsto del paquete es con un espacio de nombres calificado ( pacman::).
Konrad Rudolph
55
@TylerRinker Pido disculpas por ser combativo en este tema, pero realmente creo que la comunidad R simplemente está equivocada aquí, y prácticamente cualquier otro lenguaje moderno lo hace bien: usted dice "Esto protege contra conflictos de espacio de nombres". - ¡Pero para eso están los espacios de nombres! La responsabilidad de los escritores de paquetes es educar a las personas para que usen los paquetes correctamente, no para acomodar sus prácticas de programación descuidadas.
Konrad Rudolph
24

Esto debería funcionar:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})

(La clave es que el argsargumento do.call(what, args) debe ser una lista, ¡incluso si solo tiene un único elemento!)

Josh O'Brien
fuente
16

Para alguien que quiere instalar y cargar paquetes simultáneamente, encontré esta función desde este enlace

# ipak function: install and load multiple R packages.
# check to see if packages are installed. Install them if they are not, then load them into the R session.

ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}

# usage
packages <- c("ggplot2", "plyr", "reshape2", "RColorBrewer", "scales", "grid")
ipak(packages)
bala
fuente
Hola, creé un archivo R a partir de su fragmento dado. Cuando ejecuto esa secuencia de comandos en el servicio Amazon EMR, me da el siguiente resultado como se especifica en la siguiente URL. pastie.org/10402378#3,10-11,13 .
Rubin Porwal
9

Una opción alternativa proviene del paquete easypackages. Una vez instalado, puede cargar paquetes de la manera más intuitiva:

libraries("plyr", "psych", "tm")

El paquete también incluye una función para instalar varios paquetes:

packages("plyr", "psych", "tm")

La referencia aquí .

luchonacho
fuente
El nombre de la función es bastante confuso / confuso. "Biblioteca", en la libraryfunción, se refiere a la ubicación donde se instalan los paquetes : la biblioteca de paquetes . Cargar varios paquetes a través de librariesno tiene sentido. Tener una función separada packagesque hace otra cosa solo empeora esto. Sé que nombrar es un problema difícil en la ingeniería de software, pero realmente. Estos nombres son particularmente malos.
Konrad Rudolph
2
@KonradRudolph No estoy de acuerdo con que el nombre librariesno tenga sentido. Es el plural de library, y librarycarga un solo paquete; librariescarga una pluralidad de paquetes. Si piensa libraryque significa "cargar desde su biblioteca única" y lo extiende al librariessignificado de "cargar desde múltiples bibliotecas", entonces tal vez no sea intuitivo, pero esa no es la intención; Estaría bastante contento con el nombre libraries.
Jamie S
@JamieS Pero todavía (por lo general) se carga desde una sola biblioteca. Parece confundir la biblioteca y el paquete (que, para ser justos, se ha vuelto común en R): La "biblioteca R", como mi comentario anterior declaró, se refiere a la ubicación (directorio / directorios) donde están instalados los paquetes R . En el ejemplo de esta respuesta, "plyr", "psych" y "tm" no son bibliotecas: son paquetes.
Konrad Rudolph el
4

Simplemente puede usar el paquete lubripack e instala perfectamente nuevos paquetes y luego los carga todos en una línea.

lubripack("plyr", "psych", "tm")

Aquí está la salida después de ejecutar el código anterior en RStudio.

ingrese la descripción de la imagen aquí

Cómo instalar el paquete:

Ejecute el siguiente código para descargar el paquete e instalarlo desde GitHub. No es necesario tener una cuenta de GitHub.

library(devtools)
install_github("espanta/lubripack")
Espanta
fuente
55
Supongo que usaría imágenes en lugar de texto
The Unfun Cat
3
Esto tampoco responde a la pregunta de una manera que aún no se ha respondido y parece ser sobre todo una autopromoción.
Tyler Rinker
Tienes razón, traté de responder implícitamente la pregunta. Hagámoslo explícito esperando que pueda ser una respuesta a la pregunta.
Espanta
@TylerRinker ¿Cómo es eso ahora?
Espanta
3

Basándose en la solución de daroczig, si no desea especificar una lista como entrada, puede usar

# Foo
mLoad <- function(...) {
  sapply(sapply(match.call(), as.character)[-1], require, character.only = TRUE)
}

# Example 
mLoad(plyr, dplyr, data.table)

... que es más corto que

lapply(list('plyr', 'dplyr', 'data.table'), require, character.only = TRUE)
goclem
fuente
2

Yo uso la siguiente función:

mrip <- function(..., install = TRUE){
    reqFun <- function(pack) {
        if(!suppressWarnings(suppressMessages(require(pack, character.only = TRUE)))) {
            message(paste0("unable to load package ", pack,
                           ": attempting to download & then load"))
            install.packages(pack)
            require(pack, character.only = TRUE)
        }
    }
    lapply(..., reqFun)
}

Esto intenta cargar, y si falla se instala y luego intenta cargar nuevamente.

ricardo
fuente
2

Creo que el código que ha proporcionado @daroczig se puede mejorar reemplazando requirecon libraryy ajustando la lapplyllamada dentro de la invisible()función. Entonces, el código mejorado se verá así:

invisible(lapply(x, library, character.only = TRUE))

Este código se mejora porque:

  1. library()generalmente se prefiere require()a cargar paquetes porque el primero da un error si el paquete no está instalado, mientras que el último solo da una advertencia. Además, require()llamadas library(), ¿por qué no usarlas library()directamente?

    library("time")
    # Error in library("time") : there is no package called ‘time’
    
    require("time")
    # Loading required package: time
    # Warning message:
    # In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
    # there is no package called ‘time’
  2. El objeto de lista devuelto e impreso por la lapply()llamada no tiene sentido en este caso, por lo que tiene sentido hacer que la salida sea invisible. Digamos que usa R Notebook para su trabajo de análisis, el uso de la invisible()función suprimirá el contenido del objeto de la lista y evitará el desorden en el archivo de cuaderno renderizado.

Ashirwad
fuente
1

Ligero mod de la respuesta de Tyler Rinker para agregar un cheque para instalar y cargar pacman:

#Install/load pacman
if(!require(pacman)){install.packages("pacman");require(pacman)}
#Install/load tons of packages
p_load(plyr,psych,tm)

¡Me gusta la solución p_load porque evita las citas!

mattador
fuente