R - 有条件地调用另一个函数的函数

时间:2016-10-06 22:58:41

标签: r function igraph

我正在使用igraph包,我正在尝试构建一个计算不同算法实现的社区内边缘数的函数。我尝试连接函数内部的所有东西,甚至算法社区检测功能。像这样:

library("igraph")

intra.edges<-function(G,algorithm) {
  if(algorithm==1){
    Mod<-cluster_louvain(G)}
  if(algoritmo==2){
    Mod<-cluster_edge_betweenness(G)}
  if(algoritmo==3){
    Mod<-cluster_walktrap(G)}

Com<-as.data.frame(sizes(Mod))
NoCom<-as.vector(Com$Community.sizes)
vert<-NULL
  for(i in 1:length(NoCom)){
    M<-which(membership(Mod)==i)
    sg<-induced.subgraph(G,M)
    c.ec<-ecount(sg)
    vert<-c.ec
  }
  intra<-data.frame(Com,vert)
  print(intra)
}

当我尝试该功能时,它无法正常工作。例如:

当我跑步时:

G <- graph.famous("Zachary")
intra.edges(G,1)

我明白了:

Community.sizes     Freq    vert
      1              9       6
      2              7       6
      3              9       6
      4              4       6
      5              5       6

当我运行intra.edges(G,2)intra.edges(G,3)时,我得到相同的输出。

此外,并非所有网络组件都有六个顶点,它只在一个组件中。

1 个答案:

答案 0 :(得分:1)

通过将代码更改为:

,您可以在for循环的每次迭代中将计算出的vert值添加到数据框中
intra<-Com
  for(i in 1:length(NoCom)){
    M<-which(membership(Mod)==i)
    sg<-induced.subgraph(G,M)
    intra$vert[i]<-ecount(sg)
  }
print(intra)

或者,正如@ dash2建议的那样,创建一个名为vert的向量,并按顺序添加值:

vert<-NULL
  for(i in 1:length(NoCom)){
    M<-which(membership(Mod)==i)
    sg<-induced.subgraph(G,M)
    c.ec<-ecount(sg)
    vert[i]<-c.ec
  }