R — функция, которая вызывает условно другие функции

#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.frame

5. @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
  }