2013-02-01 47 views
24

Có cách nào đơn giản để có danh sách các gói phụ thuộc R (tất cả phụ thuộc đệ quy) cho gói nhất định, không cài đặt gói và phụ thuộc không? Một cái gì đó tương tự như một cài đặt giả trong portupgrade hoặc apt.Liệt kê R Gói phụ thuộc mà không cần cài đặt gói

+3

'công cụ :: dependsOnPkgs' – hadley

+3

Cảm ơn, rằng sẽ về đã cứu tôi một thời gian :), Vì nó không phải là rõ ràng trong tài liệu, một ví dụ cho Giả sử ggplot sẽ là dependsOnPkgs ("ggplot2", được cài đặt = available.packages()) –

+0

Nếu có bất kỳ hàm trợ giúp nào đó ở đâu đó ('utils',' tools'?) để trích xuất tất cả các lệnh không đệ quy từ địa chỉ 'DESCRIPTION' tập tin sau đó nó sẽ được tốt đẹp để có nó được đăng như là câu trả lời quá. Nếu không, một trình bao bọc trên 'read.dcf' sẽ giải nén các kiểu dep khác nhau + các khoảng trắng tước, có thể đạt được điều đó. – jangorecki

Trả lời

28

Bạn có thể sử dụng kết quả của hàm available.packages. Ví dụ, để xem những gì ggplot2 phụ thuộc vào:

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

Mà cho:

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

Lưu ý rằng tùy thuộc vào những gì bạn muốn đạt được, bạn có thể cần phải kiểm tra lĩnh vực Imports, quá.

+0

Cool - I luôn muốn tìm hiểu về các công cụ tiện dụng. Đáng buồn thay, điều này sẽ không làm việc cho những người trong chúng ta bị mắc kẹt sau một bức tường lửa của công ty. Chúng tôi có thể bị mắc kẹt khi làm một việc gì đó như 'browseURL ('http://cran.r-project.org/web/packages/package.name')' –

+0

Cảm ơn, điều đó đã giúp ích rất nhiều, tôi đã thay đổi phạm vi câu hỏi một chút, nhưng bằng cách đệ quy tìm kiếm danh sách Phụ thuộc và Nhập khẩu, tôi đã có sẵn để xây dựng một danh sách đầy đủ. –

+0

@CarlWitthoft nếu bạn đang sử dụng các cửa sổ, 'setInternet2()' có thể hữu ích. – hadley

5

Tôi chưa cài đặt R và tôi cần tìm hiểu xem R Packages nào là phụ thuộc khi danh sách các gói R được yêu cầu sử dụng tại công ty của tôi.

Tôi đã viết một tập lệnh bash lặp qua danh sách các gói R trong một tệp và sẽ dò tìm phụ thuộc đệ quy.

Tập lệnh sử dụng tệp có tên rinput_orig.txt làm đầu vào (ví dụ bên dưới). Tập lệnh sẽ tạo một tệp có tên là rinput.txt vì nó hoạt động.

Các kịch bản sẽ tạo ra các tập tin sau đây:

  • rdepsfound.txt - Danh sách phụ thuộc tìm thấy bao gồm các gói R đó là phụ thuộc vào nó (ví dụ dưới đây).
  • routput.txt - Liệt kê tất cả các gói R (từ danh sách gốc và danh sách phụ thuộc) cùng với giấy phép và URL CRAN (ví dụ bên dưới).
  • r404.txt - Danh sách các gói R nơi nhận được 404 khi cố gắng cuộn tròn. Điều này rất tiện lợi nếu danh sách ban đầu của bạn có bất kỳ lỗi chính tả nào.

Bash kịch bản:

#!/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 

Ví dụ rinput_orig.txt:

shiny 
rmarkdown 
xtable 
RODBC 
RJDBC 
XLConnect 
openxlsx 
xlsx 
Rcpp 

Ví dụ giao diện điều khiển đầu ra khi chạy kịch bản:

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... 

Ví dụ 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 

Ví dụ 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 

Tôi hy vọng điều này sẽ giúp người!

1

Một giải pháp gọn gàng và đơn giản khác là chức năng nội bộ recursivePackageDependencies từ thư viện packrat. Tuy nhiên, gói phải được cài đặt trong một số thư viện trên máy của bạn. Ưu điểm là nó cũng làm việc với các gói non-CRAN tự tạo. Ví dụ:

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

hiến:

[1] "R6"   "RColorBrewer" "Rcpp"   "colorspace" "dichromat" "digest"  "gtable"  
[8] "labeling"  "lazyeval"  "magrittr"  "munsell"  "plyr"   "reshape2"  "rlang"  
[15] "scales"  "stringi"  "stringr"  "tibble"  "viridisLite" 
Các vấn đề liên quan