繁体   English   中英

只安装那些尚未安装的 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(is.null(path)){
            missing_pkgs = c(missing_pkgs,this_pkg)
        }
    }
    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()
}

我不知道有任何基础 function 可以做你想做的事,所以你需要自己写。 对问题中的一个的一些评论:

帮助页面?installed.packages

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM