Carregue vários pacotes de uma só vez

174

Como posso carregar um monte de pacotes de uma só vez sem digitar novamente o comando require repetidamente? Eu tentei três abordagens, todas com falhas e queimaduras.

Basicamente, quero fornecer um vetor de nomes de pacotes para uma função que os carregue.

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

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

Respostas:

251

Várias permutações de suas funções propostas funcionam - mas apenas se você especificar o character.onlyargumento TRUE. Exemplo rápido:

lapply(x, require, character.only = TRUE)
daroczig
fonte
@Tommy & daroczig - Cool. Essa é uma solução muito mais limpa. Deixarei as minhas apenas para a posteridade e pelo que mostra sobre por que as tentativas do OP não funcionaram.
Josh O'Brien
4
Você pode aproveitar a correspondência de caráter parcial e fugir com lapply (x, requerem, ch = T) ou mesmo lapply (x, requerem, c = T)
Dason
@daroczig Este código carrega os pacotes, mas por que ele fornece as seguintes mensagens de aviso: 1: Na biblioteca (pacote, lib.loc = lib.loc, character.only = TRUE, logic.return = TRUE,: não há pacote chamado 'x' 2: Em se (! carregado) {: a condição tem comprimento> 1 e somente o primeiro elemento será usado
Anusha
@Anusha: Eu não tenho idéia do caixa eletrônico, o que você tem no seu x?
daroczig
23
Seja legal se o R :: base adicionou esse lapplytruque nativo ao library(). Seja ótimo poder dizer:library(c("plyr", "umx"))
tim
58

O pacote CRAN pacman que eu mantenho (criado com Dason Kurkiewicz) pode fazer isso:

Então o usuário pode fazer:

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

e se o pacote estiver ausente, p_loadfaça o download do CRAN ou do Bioconductor.

Tyler Rinker
fonte
7
+1! Por que você escolheu o nome abreviado p_load? Um nome mais descritivo, como load_packagestorna mais clara a intenção da função.
Paul Hiemstra
19
Porque ep significa pacote. Todas as funções do pacote que são úteis e exportadas começam com p_. Além disso, tendemos a usar um pouco a biblioteca e isso significa mais 7 caracteres. 7 caracteres x ~ 1000000 de tempo de vida útil da função x 0,5 segundos por caractere = 3500000 segundos. Isso é 58333.33 minutos, 972.2222 horas ou 40.50926 dias de vida de um programador que demos de volta para eles :-) De qualquer forma o nosso objetivo é empurrar para CRAN por 01 de fevereiro
Tyler Rinker
3
Cerca de um ano atrasado, mas finalmente enviamos para o CRAN. Deve estar pronto em alguns dias. @trinker (ou eu) certifique-se de modificar isso quando for público.
Dason 15/02/2015
5
@ Tyler Eu sei que estou atrasado anos, mas acho a sua lógica para o p_prefixo bastante duvidosa. Se o problema for a dispersão, remova o p_prefixo completamente. De fato, ter esses prefixos geralmente é desencorajado em outros idiomas por boas razões (eu disse a Hadley o mesmo com relação ao fct_absurdo dele em forcats). Isso é especialmente verdade, pois o uso pretendido do pacote é com um espaço para nome qualificado ( pacman::).
Konrad Rudolph
5
@TylerRinker Desculpas por ser combativo com esse assunto, mas eu realmente acho que a comunidade R está simplesmente errada aqui, e praticamente todas as outras línguas modernas acertam: Você diz "Isso protege contra conflitos de espaço de nome". - Mas é para isso que servem os namespaces! O ônus dos gravadores de pacotes é educar as pessoas a usar os pacotes corretamente, não para acomodar suas práticas de programação desleixadas.
21417 Konrad Rudolph
24

Isso deve fazer o truque:

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

(O ponto principal é que o argsargumento em do.call(what, args) deve ser uma lista - mesmo que tenha apenas um único elemento!)

Josh O'Brien
fonte
16

Para alguém que deseja instalar e carregar pacotes simultaneamente, deparei-me com essa função a partir deste link

# 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
fonte
Olá, criei um arquivo R a partir do seu snippet. Quando executo esse script no serviço Amazon EMR, ele fornece a seguinte saída, conforme especificado no seguinte URL. pastie.org/10402378#3,10-11,13 .
Rubin Porwal
9

Uma opção alternativa vem do pacote easypackages. Uma vez instalado, você pode carregar pacotes da maneira mais intuitiva:

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

O pacote também inclui uma função para instalar vários pacotes:

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

Referência aqui .

luchonacho
fonte
O nome da função é bastante confuso / confuso. "Library", na libraryfunção, refere-se ao local onde os pacotes estão instalados: a biblioteca de pacotes . Carregar vários pacotes via librariesnão faz sentido. Ter uma função separada packagesque faz outra coisa só piora as coisas. Eu sei que nomear é um problema difícil na engenharia de software, mas realmente. Esses nomes são particularmente ruins.
Konrad Rudolph
2
@KonradRudolph Não concordo que o nome librariesnão faça sentido. É o plural de librarye librarycarrega um único pacote; librariescarrega uma pluralidade de pacotes. Se você pensa libraryem "carregar da sua única biblioteca" e estende-o para libraries"carregar de várias bibliotecas", talvez seja pouco intuitivo, mas essa não é a intenção; Eu ficaria muito feliz com o nome libraries.
21318 Jamie S
@ JamieS Mas ainda está (normalmente) carregando de uma única biblioteca. Você parece confundir biblioteca e pacote (que, para ser justo, tornou-se comum em R): A "biblioteca R", como meu comentário anterior afirmou, refere-se ao (s) local (is) (diretório / diretórios) em que os pacotes R estão instalados . No exemplo desta resposta, "plyr", "psych" e "tm" não são bibliotecas: são pacotes.
Konrad Rudolph
4

Você pode simplesmente usar o pacote lubripack e instala novos pacotes ordenadamente e, em seguida, carrega todos eles em uma linha.

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

Aqui está a saída depois de executar o código acima no RStudio.

insira a descrição da imagem aqui

Como instalar o pacote:

Execute o código abaixo para baixar o pacote e instalá-lo no GitHub. Não é necessário ter uma conta GitHub.

library(devtools)
install_github("espanta/lubripack")
Espanta
fonte
5
Eu acho que usando imagens em vez de texto
The Unfun Cat
3
Isso também não responde à pergunta de uma maneira que ainda não foi respondida e parece ser principalmente autopromoção.
Tyler Rinker
Você está certo, tentei responder implicitamente à pergunta. Vamos torná-lo explícito, esperando que possa ser a resposta para a pergunta.
Espanta 18/05
@TylerRinker Como está agora?
Espanta 18/05
3

Com base na solução de daroczig, se você não quiser especificar uma lista como entrada, poderá usar

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

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

... que é mais curto que

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

Eu uso a seguinte função:

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)
}

Isso tenta carregar e, se falhar, é instalado e tente carregar novamente.

Ricardo
fonte
2

Eu acho que o código que o @daroczig forneceu pode ser melhorado, substituindo o requirecom librarye envolvendo a lapplychamada dentro da invisible()função. Portanto, o código aprimorado terá a seguinte aparência:

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

Este código foi aprimorado porque:

  1. library()geralmente é preferível ao require()carregamento de pacotes, porque o primeiro gera um erro se o pacote não estiver instalado, enquanto o último apenas fornece um aviso. Além disso, require()chama library(), então por que não usar library()diretamente!

    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. O objeto de lista retornado e impresso pela lapply()chamada não é significativo nesse caso, portanto, faz sentido tornar a saída invisível. Digamos que você use o R Notebook para seu trabalho de análise, o uso da invisible()função suprimirá o conteúdo do objeto de lista e evitará a confusão no arquivo do notebook renderizado.

Ashirwad
fonte
1

Ligeira modificação da resposta de Tyler Rinker para adicionar um cheque para instalar e carregar o pacman:

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

Eu gosto da solução p_load porque evita citações!

matador
fonte