首页 > 解决方案 > 包自动安装

问题描述

我试图以一种能够感知包是否存在然后安装它的方式来打包我的软件。例如下面我利用库函数中的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)
}

标签: r

解决方案


我通常会这样做:

library(utils) #needed for the source to load installed.packages()
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)

请注意,自动安装软件包并不是普遍认为的好习惯:如果用户没有网络访问权限,或者网络访问费用昂贵并且想要选择是否下载软件包等怎么办?

请注意,链接副本的答案之一指出,使用install.packages()检查是否已安装特定(小)组包效率低下:这可能是也可能不是实际问题,具体取决于上下文。


推荐阅读