可视化 R 函数依赖关系

问题描述 投票:0回答:4

对于想要可视化包依赖关系的人来说,有很多资源,但我对可视化包内的函数及其相互依赖关系特别感兴趣。有像 miniCRAN 这样的工具可以用来绘制包依赖关系图,但是有什么工具可以用来绘制包内的函数依赖关系图吗?

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

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

然后我只想要一个带有两个标记节点和连接它们的边的图,描述

func2
func1
的依赖性。

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

谢谢。

r function graph dependencies
4个回答
26
投票

我认为更好的选择(构建在 mvbutil 包的 foodweb 函数之上)是由 Github 上的 datastorm-open 在其更通用的 visNetwork 包之上构建的 DependencyGraph 包。

在我的示例中,我一直在可视化自己的维护和开发包,并对结果非常满意。

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

Dependency Graph generated by 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)

A foodweb dependency graph of make_split_coded_comments

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


9
投票

我建议使用

foodweb
 包中的 
mvbutils
函数。

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
下的示例了解更多信息。


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")
来尝试一下。


0
投票

最新的

pkgdepR
R 包 就是这么做的!它还可以使用包向量创建相同的网络。

pkgdepR 在 CRAN 上,因此您可以使用

install.packages("pkgdepR")
安装它。要在 pkgdepR 本身上使用它,您可以运行:

library(pkgdepR)
v <- deps(pkg = "pkgdepR")
plot(v)

pkgdepR output of itself: a network visualisation of how the different functions relate to one another in this package

© www.soinside.com 2019 - 2024. All rights reserved.