有什么好方法可以跟踪开发状态和/或可视化所有R软件包之间的链接(以及它的#34;第三方"依赖关系)?
我通常会尝试应用"分而治之以及#34;到目前为止 - 未来5年的战略 - 导致相当多的包装具有明确的功能范围。但是我已经达到了这样一种状态:事情已经(可感知地)变得如此分散,以至于我无法绕过所有的依赖关系,并且#34;我在实际项目中需要的乐高积木在哪里?&#34 34;再说: - /
所以我想我正在寻找
答案 0 :(得分:1)
这是一种方法,但肯定有其他好的选择。
使用ìnstalled.packages()
获取对所有包的引用的一种简单方法。如果您有多个库和解释器来分隔项目,则可以使用lib.loc
为每个项目指定库位置。这将为您提供包裹及其信息的矩阵。其中一列是“优先级”。基础包将其设置为“推荐”或“基础”。如果你开始添加“我的”或类似于你自己的东西,这是一个过滤你自己的包的简单方法。
通过提供库路径从每个库中获取矩阵。
要查找自己的包,请从通常使用的存储库中减去包列表,例如。为mypkgs <- setdiff(installed.packages()[,1], available.packages()[,1])
。然后减去基础包mypkgs <- setdiff(mypkgs, basePkgs)
。 basePkgs来自miniCran并基于优先级过滤,如上所述。然后,您应该拥有自己构建的软件包列表。
然后使用miniCran中的makeDepGraph。它获取包名称和依赖关系的信息。您可以使用installed.packages提供它,或者如果您有多个库,只需使用rbind减少矩阵并删除重复项。然后用情节绘制它。
如果您只想查看自己的包之间的依赖关系,请按上述过滤掉其他包并将其提供给makeDepGraph。
一个例子:我有一个基本安装用于各种R的东西,另一个用于当前项目的库,带有一个独立的解释器。这是一个包“flowCore”(不是我写的)的例子。它来自Bioconductor存储库。为了论证,我不会减去bioconductor包,并假设这些是我的更好地解决你的问题。
require("miniCRAN")
#get package info
inst<-installed.packages()
other_inst<-installed.packages("/Users/lovetatting/Desktop/flowproj/lib/R-3.3.0/library")
cran<-available.packages()
#pick out your own packages
mypkgs<-lapply(list(inst, other_inst), function(inst){
mine<-setdiff(
setdiff(
inst[,1], cran[,1]),
basePkgs())
})
#aggregate
mypkgs<-Reduce(union, mypkgs)
allpkgs<-Reduce(rbind, list(inst, other_inst))
plot(makeDepGraph("flowCore", allpkgs, suggests=F))
这将导致下面的依赖图
如果您对跟踪依赖项有更多具体要求,您可以随时使用信息表单installed.packages。对于包开发我自己有一个小的bash函数库,主要是围绕R CMD ...和devtools调用的包装器。但也是为了照顾R文件夹中的文件夹层次结构限制等烦恼(我捆绑所有东西,然后安装)。