【问题标题】:Package auto install [duplicate]包自动安装[重复]
【发布时间】:2019-10-09 08:37:37
【问题描述】:

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

【问题讨论】:

  • 感谢@Dason:我在搜索重复之前回答了...

标签: r


【解决方案1】:

我通常会这样做:

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)

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

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

【讨论】:

  • 嗨,本。与其他答案相比,我更喜欢您的方法。需要注意的一点是,要在源文件中使用它,显式加载“utils”很重要,否则它不会自动加载。我已将此添加到您的答案中。除了您关于允许用户选择加载什么和不加载什么的评论之外,此选项非常适合让一组功能立即运行,而无需新用户进行故障排除。
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多