5

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
}

ここで、assignとattrの呼び出しがどのような目的で機能するのかよくわかりません。グラフを割り当てると、グラフの新しいコピーが作成されますか?これはどれくらい効率的/非効率的ですか?つまり、これにより、次のようなコードでグラフのコピーがいくつ生成されますか。

V(g)$someattr <- somevector

助けてくれてありがとう。

4

1 に答える 1

1

を使用して頂点シーケンスを生成する場合、頂点シーケンスオブジェクト自体とともにシーケンスを作成するために使用されたグラフのコピーをV呼び出してassign保存します。attrこのように、のようなことをするときV(g)$color = 'blue'、頂点シーケンスはこのコピーのコンテキストで便利に評価できますgigraph.vsクラスで使用可能なメソッドの1つを調べると、これは明らかです。

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

$ここで、インデックス付け操作は、頂点シーケンスの作成に使用されたグラフ環境のコンテキストで評価されることは明らかです。

グラフの複数のコピーが作成されるという点は良い点です(おそらくガベージコレクションが行われますが、それでも注意するのは良いことです)。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"
于 2011-11-13T22:35:53.580 に答える