2013-02-01 9 views
24

パッケージとその依存関係をインストールせずに、特定のパッケージのRパッケージ依存関係(すべての再帰依存関係)のリストを取得する簡単な方法はありますか?ポートアップグレードまたはaptの偽のインストールと似たもの。パッケージをインストールしないでRパッケージの依存関係を表示する

+3

'ツール:: dependsOnPkgs' – hadley

+3

おかげで、それが文書で明示的にではないので、私にいくつかの時間:)を保存したのだろう、たとえば(ggplot2、installed = available.packages()) –

+0

ローカルの 'DESCRIPTION'からすべてのdepsを非再帰的に抽出するためのヘルパー関数(' utils'、 'tools'?)があれば、ggplotはdependsOnPkgsファイルを作成すると、答えとして投稿されてもいいと思います。さもなければ、 'read.dcf'の様々なdep型+白い空白を取り除くラッパーは、それを達成することができます。 – jangorecki

答えて

28

available.packages関数の結果を使用できます。例えば、ggplot2が依存するものを見るために:与える

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

:あなたが達成したいかに応じて、あなたも、Importsフィールドをチェックする必要があること

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

注意を。

+0

クール - 私常に便利なツールについて知りたい悲しいことに、これは企業のファイアウォールの後ろについている私たちにとってはうまくいかないでしょう。私たちは 'browseURL( 'http://cran.r-project.org/web/packages/package.name')' –

+0

のようなことをやっているかもしれません。おかげで、多くの助けになりました。再帰的にDependsとImportsのリストを検索することで、完全なリストを作成することができました。 –

+0

@CarlWitthoftあなたがウィンドウを開いているなら、 'setInternet2()'が役に立ちます。 – hadley

5

私はRをインストールしていないので、どのRパッケージが私の会社での使用が要求されているRパッケージのリストに依存しているかを知る必要がありました。

私は、ファイル内のRパッケージのリストを反復し、再帰的に依存関係を発見するbashスクリプトを書いています。

このスクリプトでは、入力としてrinput_orig.txtというファイルが使用されます(下記例)。スクリプトは、rinput.txtという名前のファイルを作成します。

スクリプトは、以下のファイルを作成します。

  • rdepsfound.txt - それは(下の例)に依存しているRパッケージを含めたリストの依存関係を。
  • routput.txt - ライセンスとCRAN URL(以下の例)とともに、すべてのRパッケージ(元のリストと依存関係のリストから)を一覧表示します。
  • 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です。ただし、パッケージはライブラリにインストールする必要があります。利点は自作のnon-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"