2

我正在尝试将图形与graph.unioniGraph 结合起来,但是当我这样做时,生成的图形不会保留其顶点标签。

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