我怎么能一次加载一堆包,而不需要一遍又一遍地键入要求命令?我尝试了三种方法,都失败了。
基本上,我想为一个函数提供一个包名向量,该函数将加载它们。
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)
当前回答
我使用以下函数:
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的解决方案,如果不想指定一个列表作为输入,可以使用
# 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)
对于那些想要同时安装和加载包的人来说,我从这个链接中遇到了这个函数
# 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)
这应该可以达到目的:
lapply(x, FUN = function(X) {
do.call("require", list(X))
})
(关键是do中的args参数。Call (what, args)必须是一个列表——即使它只有一个元素!)
我认为@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.
你所提议的函数的几种排列是可行的——但前提是你指定了字符。唯一的论点为真。简单的例子:
lapply(x, require, character.only = TRUE)