只安装那些尚未安装的R包(股份有限公司cran和github):任何内置方式



我希望简化我的代码库,并有下面的解决方案来安装尚未安装的软件包,但我想通过询问是否有一些官方方法可以做我不知何故错过的同样的事情来再次检查我是否没有重新发明轮子。谢谢

#' Installs any packages not already installed
#' @examples
#' dontrun{
#' install_if_missing(c('tidyverse','github.com/stan-dev/cmdstanr'))
#' }
install_if_missing = function(pkgs){
missing_pkgs = NULL

for(this_pkg in pkgs){
path = NULL
try(
path <- find.package(basename(this_pkg),quiet=T,verbose=F)
, silent = T
)
if(length(path)==0){
missing_pkgs = c(missing_pkgs,this_pkg)
}else{
message('Found ',this_pkg,' @ "',path,'"')
}
}
cran_missing = missing_pkgs[!grepl('github.com/',fixed=T,missing_pkgs)]
if(length(cran_missing)>0){
message('The following required but uninstalled CRAN packages will now be installed:n',paste(cran_missing,collapse='n'))
install.packages(cran_missing)
}
github_missing = missing_pkgs[grepl('github.com/',fixed=T,missing_pkgs)]
github_missing = gsub('github.com/','',github_missing)
if(length(github_missing)>0){
message('The following required but uninstalled Github packages will now be installed:n',paste(this_pkg,collapse='n'))
remotes::install_github(github_missing)
}
invisible()
}

我不知道有什么基函数可以做你想做的事情,所以你需要自己写。对问题中的的一些评论

帮助页面?installed.packages显示

不要使用它来确定是否安装了命名包(使用find.package或system.file(

因为如果安装了很多软件包,速度会很慢。

它也不会检测到包可以更新的情况;在某些情况下,拥有旧版本的软件包A将阻止您安装软件包B。

您的测试grep('github',missing_pkgs)将为CRAN包githubinstallarchivist.github(以及名称中包含"github"的任何未来包(提供糟糕的结果。你可能想测试其他东西。