2013-02-01 108 views
24

是否有一種簡單的方法可以獲得給定軟件包的R軟件包依賴關係(所有遞歸依賴關係)列表,而無需安裝軟件包及其依賴關係?類似於僞裝在portupgrade或apt中的東西。清單R無需安裝軟件包的軟件包依賴關係

+3

'工具:: dependsOnPkgs' – hadley

+3

謝謝,這會的救了我一些時間:),因爲它不是在文檔中明確,對於一個例子假設ggplot是dependsOnPkgs(「ggplot2」,installed = available.packages()) –

+0

如果有某個輔助函數('utils','tools'?)從本地'DESCRIPTION'非遞歸地提取所有的deps文件,那麼它將很高興地發佈爲答案。否則,在'read.dcf'提取各種dep類型和剝離空格的包裝器可以實現這一點。 – jangorecki

回答

28

您可以使用available.packages函數的結果。例如,看什麼ggplot2取決於:

pack <- available.packages() 
pack["ggplot2","Depends"] 

其中給出:

[1] "R (>= 2.14), stats, methods" 

請注意,這取決於你想要達到的目標,你可能需要檢查Imports場了。

+0

酷 - 我總是喜歡發現有用的工具。可悲的是,這對於我們這些被困在公司防火牆後面的人來說並不適用。我們可能會停滯不前,像'browseURL('http://cran.r-project.org/web/packages/package.name')' –

+0

謝謝,這有很大的幫助,我確實改變了問題範圍,但通過遞歸搜索取決於和導入的列表,我可以構建出完整的列表。 –

+0

@CarlWitthoft如果你在windows上,'setInternet2()'可能會有所幫助。 – hadley

5

我沒有安裝R,我需要找出哪些R軟件包依賴於在我公司使用的R軟件包列表。

我寫了一個bash腳本,它遍歷文件中R包的列表,並遞歸發現依賴關係。

腳本使用名爲的文件rinput_orig.txt作爲輸入(下面的示例)。該腳本將在創建文件時創建一個名爲rinput.txt的文件。

該腳本將創建下列文件:

  • rdepsfound.txt - 發現解釋依賴關係包括R包中依賴於它(下面的例子)。
  • routput.txt - 列出所有R軟件包(來自原始列表和依賴項列表)以及許可證和CRAN URL(以下示例)。
  • r404.txt - 嘗試捲曲時收到404的R軟件包列表。如果您的原始列表有任何錯別字,這很方便。

bash腳本:

#!/bin/bash 

# CLEANUP 
rm routput.txt 
rm rdepsfound.txt 
rm r404.txt 

# COPY ORIGINAL INPUT TO WORKING INPUT 
cp rinput_orig.txt rinput.txt 

IFS="," 
while read PACKAGE; do 
    echo Processing $PACKAGE... 

    PACKAGEURL="http://cran.r-project.org/web/packages/${PACKAGE}/index.html" 

    if [ `curl -o /dev/null --silent --head --write-out '%{http_code}\n' ${PACKAGEURL}` != 404 ]; then 
     # GET LICENSE INFO OF PACKAGE 
     LICENSEINFO=$(curl ${PACKAGEURL} 2>/dev/null | grep -A1 "License:" | grep -v "License:" | gawk 'match($0, /<a href=".*">(.*)<\/a>/, a) {print a[0]}' | sed "s/|/,/g" | sed "s/+/,/g") 
     for x in ${LICENSEINFO[*]} 
     do 
      # SAVE LICENSE 
      LICENSE=$(echo ${x} | gawk 'match($0, /<a href=".*">(.*)<\/a>/, a) {print a[1]}') 
      break 
     done 

     # WRITE PACKAGE AND LICENSE TO OUTPUT FILE 
     echo $PACKAGE $LICENSE $PACKAGEURL >> routput.txt 

     # GET DEPENDENCIES OF PACKAGE 
     DEPS=$(curl ${PACKAGEURL} 2>/dev/null | grep -A1 "Depends:" | grep -v "Depends:" | gawk 'match($0, /<a href=".*">(.*)<\/a>/, a) {print a[0]}') 
     for x in ${DEPS[*]} 
     do 
      FOUNDDEP=$(echo "${x}" | gawk 'match($0, /<a href=".*">(.*)<\/a>/, a) {print a[1]}' | sed "s/<\/span>//g") 
      if [ "$FOUNDDEP" != "" ]; then 
       echo Found dependency $FOUNDDEP for $PACKAGE... 
       grep $FOUNDDEP rinput.txt > /dev/null 
       if [ "$?" = "0" ]; then 
        echo $FOUNDDEP already exists in package list... 
       else 
        echo Adding $FOUNDDEP to package list... 
        # SAVE FOUND DEPENDENCY BACK TO INPUT LIST 
        echo $FOUNDDEP >> rinput.txt 
        # SAVE FOUND DEPENDENCY TO DEPENDENCY LIST FOR EASY VIEWING OF ALL FOUND DEPENDENCIES 
        echo $FOUNDDEP is a dependency of $PACKAGE >> rdepsfound.txt 
       fi 
      fi 
     done 
    else 
     echo Skipping $PACKAGE because 404 was received... 
     echo $PACKAGE $PACKAGEURL >> r404.txt 
    fi 

done < rinput.txt 
echo -e "\nRESULT:" 
sort -u routput.txt 

例rinput_orig.txt:

shiny 
rmarkdown 
xtable 
RODBC 
RJDBC 
XLConnect 
openxlsx 
xlsx 
Rcpp 

例控制檯輸出運行腳本時:

Processing shiny... 
Processing rmarkdown... 
Processing xtable... 
Processing RODBC... 
Processing RJDBC... 
Found dependency DBI for RJDBC... 
Adding DBI to package list... 
Found dependency rJava for RJDBC... 
Adding rJava to package list... 
Processing XLConnect... 
Found dependency XLConnectJars for XLConnect... 
Adding XLConnectJars to package list... 
Processing openxlsx... 
Processing xlsx... 
Found dependency rJava for xlsx... 
rJava already exists in package list... 
Found dependency xlsxjars for xlsx... 
Adding xlsxjars to package list... 
Processing Rcpp... 
Processing DBI... 
Processing rJava... 
Processing XLConnectJars... 
Processing xlsxjars... 
Found dependency rJava for xlsxjars... 
rJava already exists in package list... 

例rdepsfound.txt:

DBI is a dependency of RJDBC 
rJava is a dependency of RJDBC 
XLConnectJars is a dependency of XLConnect 
xlsxjars is a dependency of xlsx 

例routput.txt:

shiny GPL-3 http://cran.r-project.org/web/packages/shiny/index.html 
rmarkdown GPL-3 http://cran.r-project.org/web/packages/rmarkdown/index.html 
xtable GPL-2 http://cran.r-project.org/web/packages/xtable/index.html 
RODBC GPL-2 http://cran.r-project.org/web/packages/RODBC/index.html 
RJDBC GPL-2 http://cran.r-project.org/web/packages/RJDBC/index.html 
XLConnect GPL-3 http://cran.r-project.org/web/packages/XLConnect/index.html 
openxlsx GPL-3 http://cran.r-project.org/web/packages/openxlsx/index.html 
xlsx GPL-3 http://cran.r-project.org/web/packages/xlsx/index.html 
Rcpp GPL-2 http://cran.r-project.org/web/packages/Rcpp/index.html 
DBI LGPL-2 http://cran.r-project.org/web/packages/DBI/index.html 
rJava GPL-2 http://cran.r-project.org/web/packages/rJava/index.html 
XLConnectJars GPL-3 http://cran.r-project.org/web/packages/XLConnectJars/index.html 
xlsxjars GPL-3 http://cran.r-project.org/web/packages/xlsxjars/index.html 

我希望這可以幫助別人!

1

另一個簡潔明瞭的解決方案是庫packrat的內部函數recursivePackageDependencies。但是,該軟件包必須安裝在您的機器上的一些庫中。優點是它也可以與自制的非CRAN軟件包一起使用。例如:

packrat:::recursivePackageDependencies("ggplot2",lib.loc = .libPaths()[1]) 

,並提供:?

[1] "R6"   "RColorBrewer" "Rcpp"   "colorspace" "dichromat" "digest"  "gtable"  
[8] "labeling"  "lazyeval"  "magrittr"  "munsell"  "plyr"   "reshape2"  "rlang"  
[15] "scales"  "stringi"  "stringr"  "tibble"  "viridisLite" 
相關問題