在sapply中调用igraph::transitivity函数传递参数出错的技术咨询——基于100个Erdos Renyi模型的网络分析
我来帮你理清这个问题——核心原因是**mean_distance和transitivity的参数顺序不一样**,你之前的调用方式没适配transitivity的参数要求,导致了错误。
先分析你遇到的两个错误:
第一个错误
Error in match.arg(...) : 'arg' must be of length 1:
你写的sapply(gs, igraph::transitivity, 1:100),sapply会把1:100作为第二个参数传给transitivity,但transitivity的第二个参数是type(可选值是"global"/"local"等),你传的1:100完全不符合要求,所以报错。而mean_distance的第二个参数是节点集合v,所以你之前传1:100是有效的。第二个错误
argument "graph" is missing with no default:
你写的sapply(gs, igraph::transitivity(type = "global", 1:100))是错误的函数调用方式——你先执行了transitivity(type = "global", 1:100),但这个调用里根本没传必填的graph参数,而且sapply的第二个参数应该是函数本身,不是函数执行后的结果。
正确的解决方案
根据你需要的聚类系数类型(全局或节点平均),选下面的代码:
1. 计算每个图的全局聚类系数,再取100个图的平均值
全局聚类系数是整个图的聚类指标,直接用type="global":
set.seed(666) # 先确保你的gs列表创建正确(和你原代码一致) gs <- list() for (x in seq_len(100L)) { gs[[x]] <- erdos.renyi.game(374, 0.0084, type = "gnp", directed = F) E(gs[[x]])$weight <- sample(1:5, ecount(gs[[x]]), T) } # 正确计算全局聚类系数的均值 random_mean_clus <- sapply(gs, function(g) { igraph::transitivity(g, type = "global") }) # 取100个图的平均 mean(random_mean_clus)
2. 计算每个图的节点平均聚类系数,再取100个图的平均值
如果你说的"平均聚类系数"是指每个节点的局部聚类系数的平均值,用type="local",并且处理孤立节点(避免NA):
random_mean_clus <- sapply(gs, function(g) { # isolates="zero"把孤立节点的聚类系数设为0,避免mean计算时出现NA mean(igraph::transitivity(g, type = "local", isolates = "zero")) }) mean(random_mean_clus)
关键说明
用匿名函数function(g)的方式,能明确把sapply遍历到的每个图对象g作为transitivity的第一个参数(必填的graph参数),然后你可以自由指定其他参数(比如type),完全避免参数顺序的混淆。
内容的提问来源于stack exchange,提问作者copperring

