sta*_*yer 5 iterator r graph-theory igraph
我查看了V和E的来源,我不确定它们是如何工作的.这是V的代码:
> V
function (graph)
{
if (!is.igraph(graph)) {
stop("Not a graph object")
}
vc <- vcount(graph)
if (vc == 0) {
res <- numeric()
}
else {
res <- 0:(vc - 1)
}
class(res) <- "igraph.vs"
ne <- new.env()
assign("graph", graph, envir = ne)
attr(res, "env") <- ne
res
}
Run Code Online (Sandbox Code Playgroud)
我不太确定在这里调用assign和attr的用途是什么.分配图表是否会创建图表的新副本?效率/效率如何?也就是说,这产生了多少个图形副本,如下所示:
V(g)$someattr <- somevector
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
当使用 生成顶点序列时V,调用assign并attr存储用于创建序列的图的副本以及顶点序列对象本身。这样,当您执行类似的操作时V(g)$color = 'blue',可以在 的此副本的上下文中方便地评估顶点序列g。如果您检查该类可用的方法之一,这一点就会很清楚igraph.vs。
> methods(class='igraph.vs')
[1] [.igraph.vs [<-.igraph.vs $.igraph.vs $<-.igraph.vs print.igraph.vs
> `$.igraph.vs`
function (x, name)
{
get.vertex.attribute(get("graph", attr(x, "env")), name,
x)
}
<environment: namespace:igraph>
Run Code Online (Sandbox Code Playgroud)
很明显,$索引操作将在用于创建顶点序列的图形环境的上下文中进行评估。
您提出了一个很好的观点,尽管这确实会创建图形的多个副本(可能会被垃圾收集,但了解这一点仍然很好)。g如果您在创建顶点序列后修改图的属性,则可以很容易地证明这一点vs = V(g)。该属性在 中更新,但不在存储在附加到 的环境中的g副本中更新。gvs
> g = graph(c(0:1), directed=F)
> g = set.vertex.attribute(g, 'color', value='blue')
> vs = V(g)
> vs$color
[1] "blue" "blue"
> g = set.vertex.attribute(g, 'color', value='red')
> V(g)$color
[1] "red" "red"
> vs$color
[1] "blue" "blue"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |