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

R - Function that call conditionally another functions

我正在使用 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) 我得到相同的输出。

另外,并不是所有的网络组件都有六个顶点,它只在一个组件中。

您可以通过将代码更改为:

,将计算出的 vert 值添加到 for 循环的每次迭代中的数据框
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
  }