一次加载多个包

时间:2011-11-17 23:36:24

标签: r packages

如何在不重复输入require命令的情况下一次加载一堆包?我尝试了三种方法,所有这些方法都会崩溃并烧毁。

基本上,我想为一个将加载它们的函数提供一个包名称向量。

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

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

10 个答案:

答案 0 :(得分:212)

您提议的函数的几种排列确实有效 - 但前提是您将character.only参数指定为TRUE。快速举例:

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

答案 1 :(得分:47)

我维护的CRAN软件包 pacman (与Dason Kurkiewicz合着)可以做到这一点:

所以用户可以这样做:

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

如果包丢失p_load将从CRAN或Bioconductor下载。

答案 2 :(得分:23)

这应该可以解决问题:

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

(关键是args 中的do.call(what, args)参数必须是一个列表---即使它只有一个元素!)

答案 3 :(得分:11)

对于想要同时安装和加载软件包的人,我在下面的链接中遇到了这个功能 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)

答案 4 :(得分:7)

另一个选项来自包easypackages。安装后,您可以以最直观的方式加载包:

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

该软件包还包括一个安装多个软件包的功能:

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

参考here

答案 5 :(得分:4)

您可以简单地使用lubripack包,它可以整齐地安装新包,然后将它们全部加载到一行。

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

这是在RStudio上运行上面代码后的输出。

enter image description here

如何安装包:

运行以下代码下载软件包并从GitHub安装。无需拥有GitHub帐户。

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

我使用以下功能:

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

尝试加载,如果安装失败,则尝试再次加载。

答案 8 :(得分:0)

我认为@daroczig提供的代码可以通过将require替换为library并将lapply调用包装在invisible()函数内而得到改善。因此,改进后的代码将如下所示:

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

由于以下原因,此代码得到了改进:

    与加载library()相比,
  1. 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’

    lapply()
  2. 在这种情况下,invisible()调用返回并打印的列表对象没有意义,因此使输出不可见是有意义的。假设您使用R Notebook进行分析工作,则使用A -- B -- C -- D \ E -- F* 函数将抑制列表对象的内容并防止呈现的笔记本文件混乱。

答案 9 :(得分:0)

泰勒·林克(Tyler Rinker)的回答略有修改,以添加检查以安装和加载pacman:

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

我喜欢p_load解决方案,因为它避免了引用!