可视化 R 函数依赖性

23

有很多资源供那些想要可视化软件包依赖关系的人使用,但我特别关注于可视化软件包内函数及其相互依赖关系。像miniCRAN这样的工具可以为软件包依赖关系绘制图表,但是否有任何可用工具可以为软件包内部的函数依赖关系绘制图表呢?

例如,假设我的软件包中只有两个函数。

func1 <- function(n) return(LETTERS[n])
func2 <- function(n) return(func1(n%%26+1))

那我只需要一个带有两个标记节点和连接它们的边的图表,描绘了 func2 对于 func1 的依赖关系。

我认为很多软件包存在非常复杂的功能依赖关系,这样的实用工具可以帮助理解/组织/重构等等。

谢谢。

5个回答

26

我认为一个更好的选择(建立在mvbutil包的foodweb功能之上)是DependenciesGraph软件包,由datastorm-open在Github上构建,基于他们更通用的visNetwork包。

  • DependenciesGraph:一款用于可视化包和函数之间依赖关系的R语言软件包。

在我的例子中,我一直在使用它来可视化自己软件包的维护和开发情况,并对结果非常满意。

library(DependenciesGraph)
library(QualtricsTools) # A package I'm developing
deps <- funDependencies("package:QualtricsTools", "generate_split_coded_comments")
plot(deps)

DependenciesGraph生成的依赖图

输出结果是一个Web服务器(可以在RStudio的查看器或独立浏览器中查看),允许您通过下拉菜单或单击它们来选择特定函数,缩放和拖动它们等。对我来说,这比使用基本的R来绘制foodweb函数的输出要好得多,因为往往很难使文本在每个节点上显示得很漂亮,在foodweb图中所有边缘的颜色都不一样,而且似乎基本的R绘图函数并没有做太多工作来确保图的布局是清晰可读的。

与mvbutil的foodweb进行比较:

library(mvbutils)
library(QualtricsTools) 
deps <- foodweb(where="package:QualtricsTools", prune='make_split_coded_comments')
plot(deps)

make_split_coded_comments的食物链依赖图

(抱歉名称存在差异,但它们确实是同一个函数。我只是在制作这两个图之间重命名了该函数。)


9
我建议使用 mvbutils 软件包中的 foodweb 函数。
e <- new.env()
e$func1 <- function(n) return(LETTERS[n])
e$func2 <- function(n) return(func1(n%%26+1))

library(mvbutils)
foodweb(where = e)

请查看?mvbutils下的示例以获取更多信息。


谢谢!这很有帮助。你知道是否有一种方法可以使文本变小,或者增加缩放而不调整窗口大小吗?当我在我正在工作的软件包上运行它时,它太拥挤了,无法阅读:http://i.imgur.com/yiL9NIU.png - ctesta01
1
我在 foodweb 的文档中找到了对我上面评论的答案。他们说,如果它不可读(像我的一样),则运行 foodweb(.Last.value, cex=<<小于1的某个值>>, charlim=<<可能小于100的某个值>>) - ctesta01

6
为了完整起见,也为了毫不掩饰地宣传一下,我正在开发另一个包来解决这个问题:foodwebr。看起来DependenciesGraphs包已经好几年没有更新了,而我认为mvbutils::foodweb()的输出难以解析。这三个包在底层都使用相同的依赖关系检测算法。
使用原始例子:
e <- new.env()
e$func1 <- function(n) return(LETTERS[n])
e$func2 <- function(n) return(func1(n%%26+1))

fw <- foodwebr::foodweb(env = e)

fw
#> # A `foodweb`: 2 vertices and 1 edge 
#> digraph 'foodweb' {
#>   func1()
#>   func2() -> { func1() }
#> }

调用plot()函数显示图形(由于这是我的第一篇帖子,无法上传图片):

plot(fw)

您还可以使用tidygraph :: as_tbl_graph()创建一个tidygraph对象,这可以为您提供更多的绘图和分析选项。
tidy_fw <- tidygraph::as_tbl_graph(fw)

tidy_fw
#> # A tbl_graph: 2 nodes and 1 edges
#> #
#> # A rooted tree
#> #
#> # Node Data: 2 x 1 (active)
#>   name 
#>   <chr>
#> 1 func1
#> 2 func2
#> #
#> # Edge Data: 1 x 2
#>    from    to
#>   <int> <int>
#> 1     2     1

该软件包目前仍在开发中,但您可以使用 devtools::install_github("lewinfox/foodwebr") 来尝试使用。

这看起来很有趣,@Lewin!然而我在安装你的包时遇到了问题,出现错误:Error: Failed to install 'unknown package' from GitHub: Line starting '<U+FEFF><!DOCTYPE HT ...' is malformed!"? - Alexander Kielland
嗨@AlexanderKielland - 我在我的笔记本电脑上检查过,使用install_github()可以成功安装。那个错误看起来像是HTML文件的开头,您是在企业或大学网络内尝试吗?您可能正在遇到某种防火墙阻止页面。我在GitHub上创建了一个版本https://github.com/lewinfox/foodwebr/releases/tag/v0.1.1 - 您可以尝试下载并从zip文件安装。如果您愿意,请给我发送电子邮件<lewin dot a dot f at gmail dot com>。很乐意听取有关该软件包的反馈! - Lewin

1

1
这看起来是一个不错的工具。然而,我认为它与我的问题无关,因为我特别询问的是如何将函数依赖可视化,而非包依赖。我查看了文档,但没有看到任何支持特定功能间依赖可视化的内容。 - ctesta01
虽然此链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅链接的答案可能会因链接页面更改而变得无效。 - 来自审阅 - Shawn Hemelstrand

0

与我对@Sam Heek回答的评论类似,我认为这是离题的,因为问题特别涉及到可视化函数对其他函数的依赖关系,而不是包对包的依赖关系。 - ctesta01
虽然这个链接可能回答了问题,但最好包含答案的关键部分并提供链接以供参考。如果链接页面更改,仅有链接的答案可能无效。- [来自审查] (/review/late-answers/33163029) - Shawn Hemelstrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接