我怎么能一次加载一堆包,而不需要一遍又一遍地键入要求命令?我尝试了三种方法,都失败了。
基本上,我想为一个函数提供一个包名向量,该函数将加载它们。
x<-c("plyr", "psych", "tm")
require(x)
lapply(x, require)
do.call("require", x)
我怎么能一次加载一堆包,而不需要一遍又一遍地键入要求命令?我尝试了三种方法,都失败了。
基本上,我想为一个函数提供一个包名向量,该函数将加载它们。
x<-c("plyr", "psych", "tm")
require(x)
lapply(x, require)
do.call("require", x)
这应该可以达到目的:
lapply(x, FUN = function(X) {
do.call("require", list(X))
})
(关键是do中的args参数。Call (what, args)必须是一个列表——即使它只有一个元素!)
你所提议的函数的几种排列是可行的——但前提是你指定了字符。唯一的论点为真。简单的例子:
lapply(x, require, character.only = TRUE)
我维护的CRAN包pacman(与Dason Kurkiewicz合著)可以实现这一点:
所以用户可以这样做:
## install.packages("pacman")
pacman::p_load(dplyr, psych, tm)
如果包丢失,p_load将从CRAN或Bioconductor下载它。
我使用以下函数:
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)
}
这将尝试加载,如果失败,则安装,然后尝试再次加载。
对于那些想要同时安装和加载包的人来说,我从这个链接中遇到了这个函数
# 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)
基于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)
您可以简单地使用lubripack包,它整齐地安装新包,然后在一行中加载所有这些包。
lubripack("plyr", "psych", "tm")
下面是在RStudio中运行上述代码后的输出。
软件包安装方法:
运行下面的代码下载包并从GitHub安装。不需要有GitHub帐户。
library(devtools)
install_github("espanta/lubripack")
另一个选项来自软件包easypackages(需要安装)。你可以用最直观的方式加载包:
library("easypackages")
libraries("plyr", "psych", "tm")
该包还包括一个安装几个包的函数:
packages("plyr", "psych", "tm")
参考这里。
我认为@daroczig提供的代码可以通过用库替换require并将lapply调用包装在invisible()函数内部来改进。因此,改进后的代码将如下所示:
invisible(lapply(x, library, character.only = TRUE))
这段代码得到了改进,因为:
library() is generally preferred over require() for loading packages because the former gives an error if the package is not installed while the latter just gives a warning. Moreover, require() calls library(), so why not just use library() directly! 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’ The list object returned and printed by the lapply() call is not meaningful in this case, so it makes sense to make the output invisible. Say you use R Notebook for your analysis work, using the invisible() function will suppress the contents of the list object and prevent the clutter in the rendered notebook file.
轻微修改Tyler Rinker的回答,增加安装和加载吃豆人的检查:
#Install/load pacman
if(!require(pacman)){install.packages("pacman");require(pacman)}
#Install/load tons of packages
p_load(plyr,psych,tm)
我喜欢p_load解决方案,因为它避免了引用!