R语言igraph包图对象列表构建及批量调用保留原变量名咨询
R语言igraph批量处理图对象的解决方案
问题1:高效创建图对象集合
你无需手动拼接列表,可以直接从全局环境中筛选所有igraph类对象,自动生成带原变量名的列表:
# 筛选当前全局环境中所有属于igraph类的对象名 graph_names <- ls(envir = .GlobalEnv)[sapply(ls(envir = .GlobalEnv), function(v) inherits(get(v), "igraph"))] # 生成命名列表,列表键为原变量名,值为对应的图对象 G <- setNames(lapply(graph_names, get), graph_names)
如果只需处理指定的部分图对象,直接把要处理的变量名写为字符串向量即可,无需考虑命名规律:
# 按需指定要处理的图对象变量名 graph_names <- c("CC1", "g2", "CT3", "CC1T3") G <- setNames(lapply(graph_names, get), graph_names)
问题2:批量调用时保留原变量名
首先修正原Sfn函数的两个问题:一是eigen_centrality()返回的是列表,需取$vector获取节点中心度值,否则会报错;二是增加可选的Name参数,支持手动传入文件名前缀,避免循环中substitute()只能拿到循环变量名的问题:
Sfn <- function(x, Name = NULL) { # 未传入Name时自动读取传入变量的名称 if (is.null(Name)) { Name <- deparse(substitute(x)) } Nodes <- V(x)$name Dtotal <- degree(x, mode="all") Eigenvector <- eigen_centrality(x)$vector statistics_table <- data.frame(Nodes, Dtotal, Eigenvector) colnames(statistics_table) <- c("Nodes","Total Degrees", "Eigenvector centrality") write.table(statistics_table, file = paste0("Table_of_",Name,"_nodes.csv"), sep=",", row.names = F) print(paste0("处理完成:", Name)) }
批量调用方法
方法1:for循环遍历
for (g_name in names(G)) { Sfn(G[[g_name]], Name = g_name) }
方法2:purrr包迭代(更简洁)
library(purrr) # iwalk会自动将列表值作为第一个参数,列表键作为第二个参数传入函数 iwalk(G, Sfn)
内容的提问来源于stack exchange,提问作者PGCD
相关产品推荐
相关产品推荐

