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
Trả lời
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á.
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')' –
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 đủ. –
@CarlWitthoft nếu bạn đang sử dụng các cửa sổ, 'setInternet2()' có thể hữu ích. – hadley
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!
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ông cụ :: dependsOnPkgs' – hadley
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()) –
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