一次加载多个软件包


173

如何一次装入一堆软件包,而又不需一遍又一遍地重新键入require命令?我尝试了三种崩溃和燃烧的方法。

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

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

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

Answers:


250

建议的功能可以进行多种排列-但仅当您指定character.only参数为时才有效TRUE。快速示例:

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

@Tommy&daroczig-酷。那是一个更加清洁的解决方案。我只留下我的后代,以及关于为什么OP的尝试不起作用的说明。
乔什·奥布莱恩

4
你可以把部分字符匹配的优势,摆脱lapply(X,要求,CH = T),甚至lapply(X,要求,C = T)
达诚

@daroczig这段代码会加载软件包,但为什么会给出以下警告消息:1:在库中(软件包,lib.loc = lib.loc,character.only = TRUE,logical.return = TRUE,:没有名为的软件包'x'2:如果if(!loaded){:条件的长度> 1,并且仅使用第一个元素
Anusha 2012年

@Anusha:我不知道ATM,你有什么x
daroczig 2012年

23
如果R :: base向lapply本地添加了这个技巧,那就更好了library()。很library(c("plyr", "umx"))
蒂姆

57

我维护的CRAN软件包pacman(由Dason Kurkiewicz撰写)可以完成此任务:

因此用户可以执行以下操作:

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

如果缺少包装p_load,请从CRAN或Bioconductor下载。


7
+1!为什么选择缩写p_load?更具描述性的名称(例如)load_packages使功能的意图更加清晰。
Paul Hiemstra 2014年

19
因为p代表包。程序包中所有有用并导出的函数均以开头p_。另外,我们倾向于稍微使用库,这是额外的7个字符。功能的7个字符x〜1000000生命周期x每个字符0.5秒钟= 3500000秒。那是程序员一生的58333.33分钟,972.2222小时或40.50926天,我们已经回馈了他们:-)无论如何,我们的目标是在2月1日之前推向CRAN
Tyler Rinker 2014年

3
大约一年后,我们终于提交了CRAN。几天后应该起来。@trinker(或我)确保在发布后对其进行修改。
戴森2015年

5
@Tyler我知道我已经晚了几年,但是我发现您使用p_前缀的理由令人怀疑。如果问题是简洁,请p_完全删除前缀。实际上,出于其他原因,通常不建议在其他语言中使用这样的前缀(我已经告诉Hadley,关于他fct_在forcat中的废话,它们是相同的)。这是特别正确的,因为该软件包的预期用途是使用合格的名称空间(pacman::)。
Konrad Rudolph

5
@TylerRinker为在此问题上表现出积极性而道歉,但我确实认为R社区在这里完全是错误的,几乎所有其他现代语言都正确:您说“这可防止名称空间冲突。” —但这就是名称空间的作用!软件包编写者的责任是教育人们正确使用软件包,而不是适应他们草率的编程实践。
Konrad Rudolph

24

这应该可以解决问题:

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

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


16

对于想同时安装和加载软件包的人,我从此链接中遇到了此功能

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

您好,我从您指定的代码段创建了R文件。当我在Amazon EMR服务上运行该脚本时,它将为我提供以下URL中指定的以下输出。pastie.org/10402378#3,10-11,13
鲁宾·波沃

9

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

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

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

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

参考这里


函数名称相当混乱/混乱。函数中的“库” library是指软件包的安装位置:软件包库。通过加载多个软件包libraries没有任何意义。拥有一个单独的函数packages执行其他操作只会使情况变得更糟。我知道命名在软件工程中是一个难题,但确实如此。这些名字特别糟糕。
Konrad Rudolph

2
@KonradRudolph我不同意这个名字libraries没有道理。它是的复数形式library,并library加载单个程序包;libraries装载多个包装。如果您认为library含义是“从单个库中加载”,并将其扩展为libraries含义“从多个库中加载”,那么这也许是不直观的,但这并不是目的。我对这个名字会很满意libraries
杰米·S

@JamieS但它仍然(通常)从单个库中加载。您似乎会混淆库和软件包(公平地说,在R中已经很常见):正如我之前的评论所言,“ R库”指的是R软件包的安装位置(目录)。 。在此答案的示例中,“ plyr”,“ psych”和“ tm” 不是库:它们是软件包。
康拉德·鲁道夫

4

您可以简单地使用lubripack软件包,它会整洁地安装新软件包,然后将它们全部装入一行。

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

这是您在RStudio中运行以上代码后的输出。

在此处输入图片说明

如何安装套件:

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

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

5
我猜想用图像代替文本
Unfun Cat

3
这也不会以尚未回答的方式回答问题,并且似乎主要是自我提升。
泰勒·林克

没错,我试图隐式回答这个问题。让我们明确指出希望它可以回答问题。
Espanta

@TylerRinker现在怎么样?
Espanta

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)

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

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


2

我认为@daroczig提供了通过更换可以提高代码requirelibrary和包装的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()函数将抑制列表对象的内容并防止渲染的笔记本文件混乱。


1

泰勒·林克(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解决方案,因为它避免了引用!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.