2016-10-06 14 views
0

私はigraphパッケージを使用しています。異なるアルゴリズム実装のコミュニティ内エッジの数を計算する関数を作成しようとしています。アルゴリズムのコミュニティ検出機能であっても、関数内のすべてを連結しようとします。このように:R - 条件付きで別の関数を呼び出す関数

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)を実行すると私は同じ出力を得ます。

また、すべてのネットワークコンポーネントに6つの頂点があるわけではなく、1つのコンポーネント内にのみ存在します。あなたがあなたのコードを変更することで、あなたのforループの反復ごとにデータフレームにvertのあなたの計算値を追加するか

+1

あなたの関数内で等価性をテストするには、 '<--'を使用しています。 '=='を使うべきです。 '< - 'は代入演算子です。 – dash2

+0

@ dash2あなたはそうですが、「vert」の列には同じ値が続きます。ありがとう! – Dan

+0

あなたは 'vert 'にループの中で何度も割り当てています。以前の割り当てを上書きするたびに'vert [i] < - c.ec'のようなものがほしいかもしれません。私はあなたがこのようなことをする前にいくつかのRの基礎を学ぶ必要があるかもしれないと思う。 – dash2

答えて

1

:dash2が提案@として、

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) 

または、ベクトルを作成するには、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 
    } 
関連する問題