上面的很多答案(以及这个问题的重复)都依赖于installed.packages,这是一种不好的形式。来自文档:
当安装了数千个包时,这可能会很慢,因此不要使用它来确定是否安装了命名包(使用 system.file 或 find.package),也不要用于确定包是否可用(调用 require并检查返回值)也没有找到少量包的详细信息(使用 packageDescription)。它需要为每个已安装的软件包读取多个文件,这在 Windows 和某些网络安装的文件系统上会很慢。
因此,更好的方法是尝试使用require 加载包并在加载失败时安装(require 将返回FALSE,如果未找到)。我更喜欢这个实现:
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
if(length(need)>0){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
可以这样使用:
using("RCurl","ggplot2","jsonlite","magrittr")
这样它会加载所有包,然后返回并安装所有丢失的包(如果需要,它是插入提示询问用户是否要安装包的一个方便的地方)。它不是为每个包单独调用install.packages,而是只传递一次已卸载包的整个向量。
这是相同的功能,但带有一个窗口对话框,询问用户是否要安装缺少的软件包
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
n<-length(need)
if(n>0){
libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
print(libsmsg)
if(n>1){
libsmsg<-paste(libsmsg," and ", need[n],sep="")
}
libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
if(winDialog(type = c("yesno"), libsmsg)=="YES"){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
}