如何使用R工作的igraph中的迭代器V和E?

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)

谢谢您的帮助.

Joh*_*lby 1

当使用 生成顶点序列时V,调用assignattr存储用于创建序列的图的副本以及顶点序列对象本身。这样,当您执行类似的操作时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)