仅安装那些尚未安装的 R 包(包括 cran 和 github):任何内置方式?

Install only those R packages not already installed (inc. cran and github): any built-in way?

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

#' 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

do not use it to find out if a named package is installed (use find.package or system.file)

因为如果你安装了很多包会很慢。

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

您的测试 grep('github',missing_pkgs) 将对 CRAN 包 githubinstallarchivist.github(以及名称中包含“github”的任何未来包)给出不好的结果。您可能想测试其他东西。