Как я могу преобразовать матрицы в списке в igraph в списке по циклу?

Когда я использую цикл for от R для одновременного преобразования многих элементов (каждый из которых является матрицей) в списке в igraph объектов с помощью функции «graph.incidence», код ниже используется и выполняется:

storage2 <- list()
count_1 <- 1

for (i in 1:57) {
    storage2[[count_1]] <-  graph.incidence(storage1[[i]], mode = c("all"))
    count_1 = count_1 + 1
} 

Однако, когда я проверяю список «storage2», появляется сообщение об ошибке:

Ошибка в if (is.na(no)) no ‹- len : аргумент имеет нулевую длину

Как я могу решить эту проблему? Как я могу преобразовать матрицы в списке в igraph в списке по циклу?


person Min Heng Wang    schedule 07.01.2019    source источник
comment
Вы уверены, что у storage1 действительно хорошие матрицы от 1 до 57? Полный работающий пример кода был бы полезен.   -  person nJGL    schedule 12.01.2019


Ответы (1)


Это решение создает графики из матриц внутри списков. Может быть, вы могли бы избежать цикла. Ниже я привожу пример кода с использованием как lapply(), так и цикла.

Обратите внимание, что ваш цикл имеет два счетчика: i и count_1. Для приведенного выше примера вам не нужны оба, а только:

for (i in 1:57) {
    storage2[[i]] <-  graph.incidence(storage1[[i]], mode = c("all"))
}

Полный пример кода был бы полезен, но я думаю, вам следует убедиться, что storage1 действительно содержит правильные матрицы.

В случае, если вам нужен цикл, ваш подход со счетчиком заслуживает похвалы. Если бы вы добавляли к списку внутри цикла, storage2 <- c(storage2, graph.incidence(...) был бы менее чистым и потенциально намного медленнее, поскольку c() копирует весь список на каждой итерации, что приводит к экспоненциально увеличению времени выполнения.

Я надеюсь, что этот код поможет вам двигаться вперед.

# Some setup
library(igraph)
dimensions <- 10
networks <- 5

# Example data of a list of random matreces:
storage1 <- lapply(1:networks, function(x) m <- matrix(sample(c(0,1), dimensions^2, replace=T), nrow=dimensions))

# lapply()-solution: Make networks from each list-item in storage1
storage2 <- lapply(storage1, 'graph.incidence')

# forloop-solution: Since you specifically want to do it in a for-loop, this is one way to achieve that
storage3 <- list()
for(m in storage1){
  storage3[[length(storage3) + 1]] <- graph.incidence(m)
}

# A quick test to see that the lapply-solution in storage2 is the same
# as the loop-solution in storage3
lapply(1:length(storage2), function(x) E(storage2[[x]]) == E(storage3[[x]]) )
person nJGL    schedule 12.01.2019