2

什么是跟踪开发状态和/或可视化所有 R 包如何相互链接(及其“第三方”依赖项)的好方法?

我通常会尝试应用“分而治之”的策略,到现在 - 5 年后 - 导致相当多的包具有明确的功能范围。但是我已经达到了一种状态,事情已经(明显地)变得如此分散,以至于我无法理解所有的依赖关系,并且“我在实际项目中需要的乐高积木在哪里”:-/

所以我想我正在寻找

  1. 所有包依赖项的映射表示
  2. 一些占用空间最小的“包开发管理”框架/策略
4

1 回答 1

2

这是一种方法,但肯定还有其他好的选择。获取对所有包的引用的一种简单方法是使用ìnstalled.packages(). 如果您有多个库和解释器来分隔项目,则可以使用lib.loc. 这将为您提供包含包及其信息的矩阵。其中一列是“优先级”。基础包将其设置为“推荐”或“基础”。如果您开始添加“我的”或类似于您自己的内容,这是一种过滤掉您自己的包的简单方法。

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

要找到您自己的软件包,请从您通常使用的存储库中减去软件包列表,例如。为克兰mypkgs <- setdiff(installed.packages()[,1], available.packages()[,1])。然后减去基本包,mypkgs <- setdiff(mypkgs, basePkgs)。basePkgs 来自 miniCran 和基于上述优先级的过滤器。然后你应该有一个你自己构建的包的列表。

然后使用 miniCran 的 makeDepGraph。它需要包名称和依赖信息。您可以使用 installed.packages 提供它,或者如果您有多个库,只需使用 rbind 对矩阵进行归约并删除重复项。然后用 plot 绘制它。

如果您只想查看自己的包之间的依赖关系,请如上所述过滤掉其他包并将其提供给 makeDepGraph。

一个例子:我有一个用于各种 R 东西的基本安装和另一个用于当前项目的库,带有一个独立的解释器。这是一个带有“flowCore”包的示例(不是我写的)。它来自 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 文件夹中文件夹层次结构限制之类的烦恼(我捆绑了所有内容,并安装了它)。

于 2016-05-26T17:41:27.823 回答