如何从顶点列表中恢复原始图形

4

问题

igraph包提供了一个从顶点子集中检索原始图的接口吗?可以肯定地说,它有一些内部的方法来实现这一点,因为简单的print 会显示图中总顶点数以及选择的顶点数,通过反向工程,我能够获得原始图,但是我想知道是否有一种受API支持而不是依赖于内部命令的方法。

代码胜过言辞,这就是我的意思:

library(igraph)

G <- make_ring(10)
(v <- V(G)[1:3])
### This output tells me that `v` "knows" about the graph it is taken from
### (namely that it has 10 vertices)
## + 3/10 vertices, from 3fe4e83:
## [1] 1 2 3

相关部分可以从igraph:::print.igraph.vs中提取。
### igraph:::print.igraph.vs
graph <- get_vs_graph(x)

### igraph:::get_vs_graph
at <- attr(seq, "env")
if (class(at) == "weakref") {
   weak_ref_key(at)$me
}

也就是说,我可以做这样的事情:

all.equal(G, igraph:::get_vs_graph(v))
## TRUE

当然,我们正在使用内部功能。所以我想知道API是否提供了一种获取原始图形的专用方式,或者这不是预见的吗?

为什么?

实际上,我有一个顶点序列列表,它们来自不同的图形。理想情况下,我希望通过将列表中的顶点数与相应原始图形中的顶点数之比得出一个比率:

set.seed(1)
Gs <- lapply(10 ^ (1:4), make_ring)
Vs <- lapply(Gs, function(G) V(G)[seq(1, sample(gorder(G), 1))])

sapply(Vs, function(v) length(v) / gorder(igraph:::get_vs_graph(v)))
## [1] 0.9000 0.6800 0.6790 0.9725
1个回答

2
事实上,igraph.vs对象(和igraph.es对象)包含一个指向原始图的弱引用,我们在内部使用igraph:::get_vs_graph()来获取原始图形。我可以想象在未来的某个版本中将其公开为一个公共函数。请在我们的问题跟踪器中提交问题,我们可以在其中进一步讨论其影响。

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