可视化并跟踪您的包开发状态

Visualizing and keeping track of your package development state

什么是跟踪开发状态的好方法and/or 可视化所有 R 包如何相互链接(及其 "third-party" 依赖项)?

我通常尝试应用 "divide and conquer" 策略,到现在为止 - 5 年后 - 导致相当多的包具有明确的功能范围。但是我已经达到了这样一种状态,事情已经(可以看出)变得如此分散,以至于我无法再考虑所有依赖项和 "where are the lego pieces that I need for an actual project" :-/

所以我想我正在寻找

  1. 所有包依赖关系的地图表示
  2. 一些 "package development management" framework/strategy 占用空间最小

这是一种方法,但当然还有其他好的替代方法。 获取对所有包的引用的一种简单方法是使用 ìnstalled.packages()。如果您有多个库和解释器来分隔项目,您可以使用 lib.loc 为每个项目指定库位置。这将为您提供包含包及其信息的矩阵。其中一列是 "priority"。基本包将其设置为 "recommended" 或 "base"。如果您开始添加 "mine" 或类似于您自己的东西,这是过滤掉您自己的包的简单方法。

通过提供您的库路径从您拥有的每个库中获取矩阵。

要查找您自己的包,请从您通常使用的存储库中减去包列表,例如。对于 cran mypkgs <- setdiff(installed.packages()[,1], available.packages()[,1])。然后减去基础包,mypkgs <- setdiff(mypkgs, basePkgs)。 basePkgs 来自 miniCran,并根据上述优先级进行过滤。然后你应该有一个你自己构建的包的列表。

然后使用 miniCran 的 makeDepGraph。它获取包名称和依赖项信息。您可以使用 installed.packages 提供它,或者如果您有多个库,只需使用 rbind 减少矩阵并删除重复项。然后用plot.

画出来

如果您只想查看您自己的包之间的依赖关系,请像上面那样过滤掉其他包并将其提供给 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 文件夹中文件夹层次结构的限制之类的烦恼(我捆绑了所有东西,并安装了它)。