如何从顶点列表中检索原始图

How to retrieve the original graph from a vertex list

问题

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

确实,igraph.vs 个对象(还有 igraph.es)包含指向原始图形的弱引用,我们在内部使用 igraph:::get_vs_graph() 来获取原始图形图。

我可以想象在未来的某个版本中将它公开为一个 public 函数;请在我们的 issue tracker 中提出问题,我们可以在问题跟踪器中进一步讨论其影响。