Как я могу преобразовать матрицы в списке в igraph в списке по циклу? - PullRequest
0 голосов
/ 07 января 2019

Когда я использую цикл 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: аргумент имеет нулевую длину </p>

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

1 Ответ

0 голосов
/ 12 января 2019

Это решение создает графики из матриц внутри списков. Может быть, вы могли бы избежать петли. Я приведу пример кода с использованием 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]]) )
...