是否有一種簡單的方法可以獲得給定軟件包的R軟件包依賴關係(所有遞歸依賴關係)列表,而無需安裝軟件包及其依賴關係?類似於僞裝在portupgrade或apt中的東西。清單R無需安裝軟件包的軟件包依賴關係
回答
您可以使用available.packages
函數的結果。例如,看什麼ggplot2
取決於:
pack <- available.packages()
pack["ggplot2","Depends"]
其中給出:
[1] "R (>= 2.14), stats, methods"
請注意,這取決於你想要達到的目標,你可能需要檢查Imports
場了。
酷 - 我總是喜歡發現有用的工具。可悲的是,這對於我們這些被困在公司防火牆後面的人來說並不適用。我們可能會停滯不前,像'browseURL('http://cran.r-project.org/web/packages/package.name')' –
謝謝,這有很大的幫助,我確實改變了問題範圍,但通過遞歸搜索取決於和導入的列表,我可以構建出完整的列表。 –
@CarlWitthoft如果你在windows上,'setInternet2()'可能會有所幫助。 – hadley
我沒有安裝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
我希望這可以幫助別人!
另一個簡潔明瞭的解決方案是庫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"
- 1. 從源代碼安裝R時的軟件包依賴關係
- 2. 在安裝時安裝軟件包所需的R軟件包
- 3. 如何在R軟件包中包含所有軟件包依賴關係?
- 4. 從軟件中心安裝軟件包時出錯:無法解析軟件包依賴關係
- 5. 安裝去依賴的軟件包
- 6. pip不會安裝我的軟件包的依賴關係
- 7. Debian軟件包,依賴關係的安裝
- 8. 如何`pip安裝`具有Git依賴關係的軟件包?
- 9. 爲Scrapy安裝軟件包依賴項
- 10. 管理軟件包依賴關係
- 11. Haskell Stack從github安裝軟件包依賴關係
- 12. 使用Composer安裝軟件包依賴關係
- 13. 如何使debian軟件包安裝依賴關係
- 14. 作曲家安裝軟件包與開發依賴關係
- 15. 安裝軟件包R(Ubuntu)
- 16. R - regd軟件包依賴於另一個軟件包
- 17. 在R中安裝ShortRead軟件包的問題 - 無法安裝RCurl依賴項
- 18. R - 在ggplot2上添加軟件包依賴關係的問題
- 19. 當需要導入其他軟件包但不依賴時的R軟件包安裝
- 20. R - 無法安裝軟件包「rgl」
- 21. R:無法安裝某些軟件包
- 22. 差異軟件包,軟件包安裝,軟件包更新
- 23. 無法通過cabal安裝軟件包 - 未滿足依賴關係
- 24. Laravel 5.1軟件包開發 - 在開發中加載軟件包依賴關係
- 25. npm - 在不同文件夾中安裝軟件包的依賴關係?
- 26. 在軟件包裝中刪除Postgresql作爲依賴關係
- 27. 軟件包創建者 - 需要依賴關係
- 28. 避免軟件包依賴
- 29. 正確的Python打包與外部軟件包依賴關係
- 30. VSIX軟件包不包含引用的項目依賴關係
'工具:: dependsOnPkgs' – hadley
謝謝,這會的救了我一些時間:),因爲它不是在文檔中明確,對於一個例子假設ggplot是dependsOnPkgs(「ggplot2」,installed = available.packages()) –
如果有某個輔助函數('utils','tools'?)從本地'DESCRIPTION'非遞歸地提取所有的deps文件,那麼它將很高興地發佈爲答案。否則,在'read.dcf'提取各種dep類型和剝離空格的包裝器可以實現這一點。 – jangorecki