如何在不重复重复输入require命令的情况下一次加载一堆包?我尝试了三种方法,所有这些方法都会崩溃并烧毁。
基本上,我想为一个将加载它们的函数提供包名称的向量。
x<-c("plyr", "psych", "tm")
require(x)
lapply(x, require)
do.call("require", x)
您提出的函数的几种排列确实有效 - 但前提是您将character.only
参数指定为TRUE
。快速举例:
lapply(x, require, character.only = TRUE)
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解决方案,因为它避免引用!
我维护的CRAN包pacman(与Dason Kurkiewicz合着)可以做到这一点:
所以用户可以这样做:
## install.packages("pacman")
pacman::p_load(dplyr, psych, tm)
如果包丢失,p_load
将从CRAN或Bioconductor下载。
这应该做的伎俩:
lapply(x, FUN = function(X) {
do.call("require", list(X))
})
(关键是args
中的do.call(what, args)
参数必须是一个列表---即使它只有一个元素!)
对于想要同时安装和加载软件包的人,我在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)
另一种选择来自包easypackages
。安装后,您可以以最直观的方式加载包:
libraries("plyr", "psych", "tm")
该软件包还包括一个安装多个软件包的功能:
packages("plyr", "psych", "tm")
参考here。
在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)
我使用以下功能:
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)
}
这会尝试加载,如果安装失败,则尝试再次加载。
我认为@daroczig提供的代码可以通过用require
替换library
并在lapply
函数中包装invisible()
调用来改进。因此,改进的代码将如下所示:
invisible(lapply(x, library, character.only = TRUE))
此代码得到改进,因为:
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’
lapply()
调用返回并打印的列表对象没有意义,因此使输出不可见是有意义的。假设您使用R Notebook进行分析工作,使用invisible()
函数将抑制列表对象的内容并防止渲染的笔记本文件中出现混乱。