#r #function #igraph
#r #функция #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. Вы используете
<-
для проверки равенства внутри вашей функции. Вы должны использовать==
.<-
является оператором присваивания.2. @dash2 Вы правы, но в столбце
vert
я продолжаю получать те же значения. Спасибо!3. Вы назначаете
vert
несколько раз в цикле. Каждый раз, когда она перезаписывает предыдущее назначение. Возможно, вам понадобится что-то вродеvert[i] <- c.ec
. Я подозреваю, что вам, возможно, потребуется изучить некоторые основы R, прежде чем делать это.4. Вам нужно добавлять свое значение vert в data.frame с каждой итерацией в вашем цикле for . Как бы то ни было, вы создаете data.frame, используя
Com
и последнее значение, присвоенноеvert
. В данном случае это, по-видимому, 6. При созданииintra
`vert перерабатывается для создания вашего data.frame5. @dash2 Ты снова прав! Спасибо!!!
Ответ №1:
Вы можете либо добавить вычисленное значение vert
в dataframe с каждой итерацией вашего цикла 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
}