igraph中为何E(g)与自身调用结果不满足identical判断?
igraph中
identical(E(g), E(g))返回FALSE的原因分析 先看执行的R代码:
library(igraph) g <- make_ring(3) identical(g, g) # 符合预期返回TRUE # [1] TRUE dput(E(g)) # structure(1:3, is_all = TRUE, class = "igraph.es", env = <weak reference>, graph = "4f82a4da-3975-11ef-8958-675a79d1d14f") E(g) == E(g) # 测试相等性 # [1] TRUE TRUE TRUE all.equal(E(g), E(g)) # 再次测试 # [1] TRUE identical(E(g), E(g), ignore.environment = FALSE) # 预期返回TRUE # [1] FALSE identical(E(g), E(g), ignore.environment = TRUE) # 预期返回TRUE # [1] FALSE
原因解析
E(g)每次调用生成新对象:每次执行E(g)都会创建一个全新的igraph.es(边序列)对象,尽管它们指向同一个图的相同边,但对象内部的属性存在差异。identical()的严格检查逻辑:identical()是R中最严格的相等性判断函数,会对比对象的所有属性细节。从dput(E(g))的输出能看到,igraph.es包含env(弱引用)属性,每次生成新边序列时,这个弱引用对象都是重新创建的——哪怕它指向同一个图,弱引用本身是不同的对象,identical()会因此判定两者不相等。==和all.equal()的语义检查:==直接比较边的ID是否一致,all.equal()则会忽略内部的环境/弱引用差异,只判断边序列是否对应同一个图的相同边集合,所以它们返回TRUE。ignore.environment参数无效:这个参数仅针对常规的R环境对象,而igraph.es的env是弱引用类型,不在该参数的处理范围内,因此无论是否设置该参数,都无法忽略弱引用的差异。
内容的提问来源于stack exchange,提问作者clp
相关产品推荐
相关产品推荐

