【发布时间】:2012-02-04 10:04:39
【问题描述】:
我正在筛选一个包和使用该包的脚本,并希望确定外部依赖项。目的是修改脚本指定library(pkgName),修改包中的函数使用require(pkgName),这样以后这些依赖会更加明显。
我正在修改代码以考虑每个外部依赖包。举个例子,虽然它绝不是确定的,但我现在发现很难识别依赖于data.table 的代码。我可以将data.table 替换为Matrix、ggplot2、bigmemory、plyr 或许多其他包,因此请随时根据其他包的示例进行回答。
这个搜索并不容易。到目前为止我尝试过的方法包括:
- 在代码中搜索
library和require语句 - 搜索提及
data.table(例如library(data.table)) - 尝试运行
codetools::checkUsage以确定可能存在问题的位置。对于脚本,我的程序将脚本插入到本地函数中,并将checkUsage应用于该函数。否则,我使用checkUsagePackage作为包。 - 寻找
data.table独有的语句,例如:=。 - 查找可以通过匈牙利表示法识别对象类的位置,例如
DT
我搜索的本质是找到:
- 正在加载
data.table, - 名称表明它们是
data.table对象的对象, - 似乎是
data.table-specific 的方法
其中唯一简单的部分似乎是找到包的加载位置。不幸的是,并非所有功能都可以显式加载或需要外部包 - 这些可能假定它已经被加载。这是一个不好的做法,我正在尝试解决它。但是,搜索对象和方法似乎具有挑战性。
这个 (data.table) 只是一个包,一个似乎是有限且有些独特的用法。假设我想寻找 ggplot 函数的用途,其中选项更广泛,并且语法文本不那么特殊(即,+ 的频繁使用不是特殊的,而 := 似乎是)。
我认为静态分析不会给出完美的答案,例如可以将参数传递给函数,该函数指定要加载的包。尽管如此:是否有任何核心工具或软件包可以通过静态或动态分析来改进这种蛮力方法?
对于它的价值,tools::pkgDepends 仅解决包级别的依赖关系,而不是函数或脚本级别,这是我正在工作的级别。
更新 1:应该工作的动态分析工具的一个示例是报告在代码执行期间加载了哪些包。不过,我不知道 R 中是否存在这样的功能 - 就像 Rprof 报告 search() 的输出而不是代码堆栈。
【问题讨论】:
-
你能试试
foodweb包mvbutils吗?我自己没有这方面的经验,但对我来说似乎很有希望(除了我不知道它搜索的深度)。foodweb(where='package:data.table',prune='function_youre_examining')之类的东西? -
@mathematical.coffee 这很有趣。看起来它在包内非常有用;我还不清楚它可以做什么跨包,但我会试一试,谢谢!
-
@mathematical.coffee 这很有趣。我正在进一步解决它。您可以发表您的评论作为答案吗?假设我可以让它工作,我可能会帮助将它编辑成一个解决方案。我之前评论说它似乎不适用于跨包,但这是不正确的。
where参数似乎可以用来管理搜索空间。顺便说一句,changed.funs 的帮助读起来几乎就像我写我最近的一些经历一样。 :) -
动态地做很容易。使用trace修改一个包中的所有函数,记录函数名和调用栈。
-
随意回答你自己的问题并接受它——我知道
foodweb,但我自己没有使用过,所以你是完成所有艰苦工作的人! :)
标签: r dependencies code-analysis