#!/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
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
6条答案
按热度按时间up9lanfz1#
您可以使用
available.packages
函数的结果。例如,要查看ggplot2
依赖于什么:字符串
其给出:
型
请注意,根据您想要实现的目标,您可能还需要检查
Imports
字段。vaj7vani2#
我很惊讶没有人提到
tools::package_dependencies()
,这是最简单的解决方案,并且有一个recursive
参数(公认的解决方案没有提供)。查看CRAN上前200个软件包的递归依赖关系的简单示例:
字符串
创建于2020-12-04由reprex package(v0.3.0)
ulmd4ohb3#
另一个简洁的解决方案是
packrat
库中的内部函数recursivePackageDependencies
。但是,该软件包必须安装在您计算机上的 some 库中。其优点是它也适用于自制的非CRAN软件包。范例:字符串
给出:
型
lh80um4z4#
我没有安装R,我需要找出哪些R包依赖于我公司要求使用的R包列表。
我写了一个bash脚本,它迭代文件中的R包列表,并将递归地发现依赖项。
该脚本使用名为rinput_orig.txt的文件作为输入(示例如下)。该脚本将创建一个名为rinput.txt的文件。
该脚本将创建以下文件:
*rdepsfound.txt-列出找到的依赖项,包括依赖于它的R包(下面的示例)。
*routput.txt-列出所有R软件包(来自原始列表和依赖项列表)沿着许可证和CRAN URL(示例如下)。
*r404.txt-尝试curl时收到404的R包列表。如果您的原始列表有任何错别字,这是很方便的。
Bash脚本:
字符串
rinput_orig.txt示例:
型
脚本运行时控制台输出示例:
型
rdepsfound.txt示例:
型
routput.txt示例:
我希望这对某人有帮助!
tp5buhyn5#
我测试了我自己的解决方案(检查了本地安装的软件包)与
packrat
和tools
的解决方案。你可以发现不同方法之间的明显差异。
tools::package_dependencies
看起来为旧的R版本(直到4.1.0和recursive = TRUE
)给予太多,并且不是有效的解决方案。字符串
packrat:::recursivePackageDependencies
使用的是available.packages
,所以它是基于最新的远程包,而不是本地包。默认情况下,我的函数是跳过基本包,如果你想附加它们,请更改
base
参数。在R 4.1.0下测试:
型
创建于2021-06-25由reprex package(v0.3.0)
证明在旧的R版本下
tools
解决方案有问题。根据R 3.6.3进行测试。型
创建于2021-06-25由reprex package(v0.3.0)
1mrurvl16#
试试这个:
tools::package_dependencies(recursive = TRUE)$package_name
举个例子-这里是dplyr的依赖项:
字符串