2016-10-06 3 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) я получаю тот же результат.

Кроме того, не все компоненты с сетью имеют шесть вершин, то только в одном компоненте.

+1

Вы используете '<-' для проверки равенства внутри вашей функции. Вы должны использовать '=='. '<-' - оператор присваивания. – dash2

+0

@ dash2 Вы правы, но в столбце 'vert' я продолжаю получать одинаковые значения. Благодаря! – Dan

+0

Вы назначаете 'vert' несколько раз в цикле. Каждый раз, когда он перезаписывает предыдущее задание. Вам может понадобиться нечто вроде 'vert [i] <- c.ec'. Я подозреваю, что вам, возможно, придется изучить некоторые основы R, прежде чем делать это. – dash2

ответ

1

Вы можете добавить расчетное значение vert к dataframe с каждой итерацией для цикла, изменив код:

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 
    } 
Смежные вопросы