问题
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