当我安装yaml软件包时,如果以前安装过,则会在RStudio中弹出恼人的错误消息。如何判断软件包是否已安装,以便我可以在代码中决定是否安装软件包?
消息在弹出窗口中,它是:
此安装将更新的一个或多个软件包 目前已加载。在更新这些软件包之前重新启动R是 强力推荐。 RStudio可以重启R然后自动重启 重新启动后继续安装(所有工作和数据都将是 在重新启动期间保留)。你想在之前重启R吗? 安装?
答案 0 :(得分:12)
这将加载yaml
,如果尚未安装,则先安装它:
if (!require(yaml)) {
install.packages("yaml")
library(yaml)
}
或者如果你想参数化它:
pkg <- "yaml"
if (!require(pkg, character.only = TRUE)) {
install.packages(pkg)
if (!require(pkg, character.only = TRUE)) stop("load failure: ", pkg)
}
更新。参数化。
答案 1 :(得分:8)
您可以使用installed.packages()
查找已安装的软件包
答案 2 :(得分:3)
或者,您可以使用require
功能。它将尝试加载包并静默返回一个逻辑,说明包是否可用。如果无法加载包,也会发出警告。
test1 <- require("stats")
test1
test2 <- require("blah")
test2
答案 3 :(得分:1)
我在我的代码中使用以下构造。关键部分是在library
内调用tryCatch
并在失败时安装它:
lib.auto <- function(lib, version=NULL, install.fun=install.packages, ...) {
tryCatch(
library(lib, character.only=T),
error=function(e) {
install.fun(lib, ...)
library(lib, character.only=T)
}
)
if (!is.null(version)) {
if (packageVersion(lib) < version) {
require(devtools)
detach(paste0('package:', lib), unload=T, character.only=T)
install.fun(lib, ...)
library(lib, character.only=T)
if (packageVersion(lib) < version) {
stop(sprintf('Package %s not available in version %s. Installed version: %s', lib, version,
packageVersion(lib)))
}
}
}
}
lib.auto('BiocInstaller',
install.fun=function(lib) {
source("http://bioconductor.org/biocLite.R")
biocLite(lib)
})
options(repos=biocinstallRepos())
lib.auto.bioc <- lib.auto
lib.auto.github <- function(lib, version=NULL, user, subdir=NULL, repo=lib)
lib.auto(lib, version=version,
install.fun=function(l, u, s, r) {
require(devtools)
install_github(r, u, subdir=s)
},
user, subdir, repo
)
如果需要,lib.auto
功能将从CRAN和Bioconductor安装。来自GitHub的lib.auto.github
安装。
我正在考虑将此代码推送到包中。