簡體   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