一次加载多个包

Tyl*_*ker 160 packages r

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

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

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

require(x)
lapply(x, require)
do.call("require", x)
Run Code Online (Sandbox Code Playgroud)

dar*_*zig 231

您提出的函数的几种排列确实有效 - 但只有在您指定character.only参数时才有效TRUE.快速举例:

lapply(x, require, character.only = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 如果R :: base在`library()`中添加了这个`lapply`技巧,那就太好了.很高兴能够说:`库(c("plyr","umx"))` (18认同)
  • 您可以利用部分字符匹配并使用lapply(x,require,ch = T)或甚至lapply(x,require,c = T) (4认同)

Tyl*_*ker 52

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

所以用户可以这样做:

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 
Run Code Online (Sandbox Code Playgroud)

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

  • 因为p代表包装.包中的每个有用和导出的函数都以`p_`开头.另外,我们倾向于使用库,这是另外7个字符.7个字符x~1000000寿命使用函数x .5秒每个字符= 3500000秒.这是58333.33分钟,972.2222小时或40.50926天程序员的生命我们已经回馈给他们:-)无论如何我们的目标是在2月1日之前推向CRAN (16认同)
  • +1!你为什么选择短名称`p_load`?更具描述性的名称,例如`load_packages`,使函数的意图更加清晰. (6认同)
  • @Tyler我知道我已经很晚了但是我发现你对'p_`前缀的理由相当可疑.如果简洁是问题,请完全删除`p_`前缀.事实上,出于好的理由,在其他语言中通常不鼓励使用这样的前缀(我告诉Hadley他们在forcats中的'fct_`废话也是如此).这是*特别是*true,因为包的预期用法是使用限定名称空间(`pacman ::`). (5认同)
  • @TylerRinker抱怨在这个问题上好斗,但我真的认为R社区在这里是完全错误的,几乎所有其他现代语言都是正确的:你说"这可以防止命名空间冲突." - 但是*这就是命名空间适用于!*包装编写者的责任是教育人们正确使用包装,而不是适应他们草率的编程习惯. (5认同)
  • 大约一年后我们终于提交给了CRAN.应该在几天内起来.@trinker(或我)确保一旦公开就修改它. (3认同)
  • 凉!我想这可以解决问题/sf/ask/653914481/和/sf/ask/286311861/(我看到您已经发布了针对后者的答案,但没有针对前者发布答案,无论如何都是关闭的)。 (2认同)
  • @Ivo `character.only = TRUE` 或 `p_load(char = pks)` (2认同)

Jos*_*ien 24

这应该做的伎俩:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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


luc*_*cho 7

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

libraries("plyr", "psych", "tm")
Run Code Online (Sandbox Code Playgroud)

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

packages("plyr", "psych", "tm")
Run Code Online (Sandbox Code Playgroud)

参考这里.

  • @KonradRudolph 我不同意`libraries` 这个名字没有意义。它是`library`的复数形式,`library`加载单个包;`libraries` 加载多个包。如果你认为 `library` 的意思是“从你的单个库加载”,并将其扩展到 `libraries` 的意思是“从多个库加载”,那么这可能是不直观的,但这不是本意;我会很高兴使用“图书馆”这个名字。 (4认同)

Ash*_*wad 7

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

invisible(lapply(x, library, character.only = TRUE))
Run Code Online (Sandbox Code Playgroud)

此代码已改进,因为:

  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’
    
    Run Code Online (Sandbox Code Playgroud)
  2. lapply()在这种情况下,调用返回和打印的列表对象没有意义,因此使输出不可见是有意义的。假设您使用 R Notebook 进行分析工作,使用该invisible()函数将抑制列表对象的内容并防止渲染的笔记本文件中出现混乱。


Esp*_*nta 6

您可以简单地使用 lubripack 包,它会整齐地安装新包,然后在一行中加载所有包。

lubripack("plyr", "psych", "tm")
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

如何安装软件包:

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

library(devtools)
install_github("espanta/lubripack")
Run Code Online (Sandbox Code Playgroud)

  • 我猜想使用图像而不是文本 (5认同)
  • 这也没有以尚未回答的方式回答问题,似乎主要是自我推销。 (4认同)