当我通过函数“ graph.incidence”使用R的for循环将列表中的许多元素(每个元素都是矩阵)同时转换为igraph
个对象时,将使用并执行以下代码:
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
?
答案 0 :(得分:0)
此解决方案使用列表内的矩阵制作图形。也许您可以避免循环。我在下面提供了一个使用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]]) )