我正在尝试以某种方式打包我的软件,该软件会感知该软件包是否存在,然后安装(如果没有)。例如,在下面的示例中,我利用了库函数中的logical.return。原因是我的代码开始在世界范围内传播,我希望它可以自动安装必要的软件包,以便在不存在该软件包时用户不必处理错误。
这组代码写在我要导入的所有功能的顶部。
我设想的是,如果不存在该代码集,则将安装该软件包。但是这组代码并没有达到我的预期。
我的第一个问题是在执行下面的代码之前如何指定我的CRAN镜像。
我的第二个问题是否有更好的方法来实现?
if( !library(reticulate, logical.return = T) ){
install.packages('reticulate');library(reticulate)
}
if( !library(png, logical.return = T) ){
install.packages('png');library(png)
}
if( !library(RColorBrewer, logical.return = T) ){
install.packages('RColorBrewer');library(RColorBrewer)
}
答案 0 :(得分:2)
我通常这样做:
options(repos=c("https://cran.rstudio.com",
getOption("repos")))
## designate packages to install/load
all_pkgs <- c("reticulate","png","RColorBrewer")
## find packages that need to be installed
already_installed <- rownames(installed.packages())
to_install <- setdiff(all_pkgs,already_installed)
if (length(to_install)>0) {
install.packages(to_install, dependencies=TRUE)
}
## now load all packages
sapply(all_pkgs, library, character.only=TRUE, logical.return=TRUE)
请注意,自动安装软件包并不是一种普遍的做法:如果用户没有网络访问权限,或者具有昂贵的网络访问权限并希望选择是否下载软件包,该怎么办?
请注意,对linked duplicate的回答之一指出,使用install.packages()
检查是否已经安装了一组特定的(小型)软件包效率低下:这可能是实际的,也可能不是实际的问题取决于上下文。