Загружать сразу несколько пакетов

Как я могу загружать кучу пакетов за один раз с повторным набором команды require снова и снова? Я пробовал три подхода, все из которых сбой и сжигание.

В принципе, я хочу предоставить вектор имен пакетов функции, которая будет их загружать.

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

require(x)
lapply(x, require)
do.call("require", x)

Ответ 1

Несколько перестановок ваших предлагаемых функций работают, но только если вы указываете аргумент character.only как TRUE. Быстрый пример:

lapply(x, require, character.only = TRUE)

Ответ 2

Пакет CRAN pacman, который я поддерживаю (автор Dason Kurkiewicz), может выполнить это:

Таким образом, пользователь может:

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

и если пакет отсутствует p_load загрузит его из CRAN или Bioconductor.

Ответ 3

Это должно сделать трюк:

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

(Бит ключа заключается в том, что аргумент args в do.call(what, args) должен быть списком --- даже если он содержит только один элемент!)

Ответ 4

для тех, кто хочет установить и загрузить пакеты одновременно, я наткнулся на эту функцию в ссылке ниже https://gist.github.com/stevenworthington/3178163

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

Ответ 5

Альтернативный вариант поставляется из пакета easypackages. После установки вы можете загружать пакеты наиболее интуитивно понятным способом:

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

В пакет также входит функция для установки нескольких пакетов:

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

Ссылка здесь.

Ответ 6

Вы можете просто использовать пакет lubripack, и он аккуратно устанавливает новые пакеты, а затем загружает их все в одну строку.

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

Вот вывод после запуска кода выше в RStudio.

enter image description here

Как установить пакет:

Запустите приведенный ниже код, чтобы загрузить пакет и установить его с GitHub. Нет необходимости иметь учетную запись GitHub.

library(devtools)
install_github("espanta/lubripack")

Ответ 7

Основываясь на решении daroczig, если вы не хотите указывать список в качестве ввода, вы можете использовать

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

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

... который короче

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

Ответ 8

Я использую следующую функцию:

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

Это пытается загрузить, и если он не удается установить, а затем попытаться загрузить снова.

Ответ 9

Я думаю, что код, предоставленный @daroczig, можно улучшить, заменив require library и lapply вызов lapply в функцию invisible(). Итак, улучшенный код будет выглядеть следующим образом:

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

Этот код улучшен, потому что:

  1. library() обычно предпочтительнее, чем require() для загрузки пакетов, потому что первый выдает ошибку, если пакет не установлен, а последний просто выдает предупреждение. Более того, require() вызывает library(), так почему бы просто не использовать library() напрямую!

    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. Объект списка, возвращенный и напечатанный lapply() в этом случае не имеет смысла, поэтому имеет смысл сделать вывод невидимым. Допустим, вы используете R Notebook для анализа, используя функцию invisible() чтобы подавить содержимое объекта списка и предотвратить беспорядок в отображаемом файле ноутбука.

Ответ 10

Небольшой мод ответа Тайлера Ринкера, чтобы добавить проверку для установки и загрузки pacman:

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

Мне нравится решение p_load, потому что оно избегает цитирования!