Учитывать:
library(igraph)
g <- make_ring(3)
identical(g, g) # TRUE as expected
# [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) # test equality.
# [1] TRUE TRUE TRUE
all.equal(E(g), E(g)) # Next try.
# [1] TRUE
identical(E(g), E(g), ignore.environment = FALSE) # Expecting TRUE.
# [1] FALSE
identical(E(g), E(g), ignore.environment = TRUE) # Expecting TRUE.
# [1] FALSE
Вопрос: Почему неверно?
См. igraph.org/r/doc/identical_graphs.html
Я предполагаю, что identical
дает FALSE
, поскольку E(g)
назначаются разные адреса памяти между первым и вторым вызовами, например
> library(data.table)
> address(E(g))
[1] "000001a51697f368"
> address(E(g))
[1] "000001a516666e68"
но если они указывают на одну и ту же ссылку, вы можете получить TRUE
> e <- E(g)
> identical(e, e)
[1] TRUE
Взгляните на unclass(E(g))
:
[1] 1 2 3
attr(,"is_all")
[1] TRUE
attr(,"env")
<weak reference>
attr(,"graph")
[1] "a075a1af-ef79-4811-8876-3c0d2d45085f"
Он содержит «слабую ссылку», представляющую собой экзотический объект R, который вы редко видите. Каждый раз, когда вы вызываете E(g)
, вы создаете новую слабую ссылку, и поэтому identical()
говорит, что они не идентичны.
ОТРЕДАКТИРОВАНО, чтобы добавить:
О слабых ссылках можно прочитать здесь: ?rlang::new_weakref
. Здесь также есть примечания: http://homepage.divms.uiowa.edu/~luke/R/references/weakfinex.html, но неясно, актуальны ли они.
Код, который выполняет сравнение identical()
, находится здесь:
Из комментария неясно, уверены ли авторы этих строк в правильности своего поступка. Вероятно, было бы разумнее сказать, что две слабые ссылки идентичны, если они ссылаются на один и тот же объект и имеют одни и те же связанные данные и метод завершения.
Взгляните на это: rdocumentation.org/packages/base/versions/3.6.2/topics/…, особенно на ту часть, где показано использование
ignore.environment
.