2

iGraph でグラフに結合しようとしてgraph.unionいますが、結果のグラフで頂点ラベルが保持されません。

testGraph1 = barabasi.game(3, 
    m = 5,
    power = 0.6, 
    out.pref = TRUE,
    zero.appeal = 0.5,
    directed = TRUE)
V(testGraph1)$name = c('one', 'two', 'three')   

testGraph2 = barabasi.game(5, 
    m = 5,
    power = 0.6, 
    out.pref = TRUE,
    zero.appeal = 0.5,
    directed = TRUE)    
V(testGraph2)$name = c('one', 'two', 'three', 'four', 'five')   

combine = graph.union(testGraph1, testGraph2)
V(combine)$name #Is NULL

も使用してみgraph.union.by.nameましたが、どちらのテスト グラフも確実に方向付けられているため、バグがあると思いますが、奇妙なエラーが発生しています。

combine = graph.union.by.name(testGraph1, testGraph2)
#Error: !is.directed(g1) & !is.directed(g2) is not TRUE
4

1 に答える 1

2

graph.union.by.nameの先頭に、ドキュメントと一致しないチェックがあるようです。それを削除し、最後の行に有向オプションを追加すると、必要なものが得られると思います。

gubm = function (g1, g2, dir=FALSE) 
{
  #stopifnot(!is.directed(g1) & !is.directed(g2))
    dv1 = igraph:::get.vertices.as.data.frame(g1)
    dv2 = igraph:::get.vertices.as.data.frame(g2)
    de1 = igraph:::get.edges.as.data.frame(g1)
    de2 = igraph:::get.edges.as.data.frame(g2)
    dv = igraph:::safer.merge(dv1, dv2, all = TRUE)
    de = igraph:::safer.merge(de1, de2, all = TRUE)
    g = igraph:::graph.data.frame(de, directed = dir, vertices = dv)
    return(g)
}

> combine=gubm(testGraph1,testGraph2,TRUE)
> V(combine)$name
[1] "one"   "three" "two"   "five"  "four" 

ただし、これを多くの例でチェックして、正しく動作することを確認してください。igraph開発者はこれをここで見つけると思いますが、igraphメーリングリストまたはigraphバグトラッカーでバグとして報告する必要があります。

graph.union名前が保持されない理由は、呼び出し内のすべてのグラフがノードで同じ属性を持つという保証がなく、確認するのが面倒だからだと思います...

于 2012-11-05T13:37:35.450 に答える