为什么两个 ggplot 对象通过 all.equal() 测试,但未通过 identical() 测试?

Why do two ggplot objects pass an all.equal() test, but fail identical() test?

我想测试 ggplot 生成的两个图形是否相同。一种选择是在绘图对象上使用 all.equal,但我宁愿进行更严格的测试以确保它们相同,这似乎是 identical() 为我提供的东西。

但是,当我测试使用 same datasame aes 创建的两个绘图对象时,我发现 all.equal() 将它们识别为相同,而对象没有通过 identical 测试。我不确定为什么,我很想了解更多。

基本示例:

graph <- ggplot2::ggplot(data = iris, aes(x = Species, y = Sepal.Length))
graph2 <- ggplot2::ggplot(data = iris, aes(x = Species, y = Sepal.Length))

all.equal(graph, graph2)
# [1] TRUE

identical(graph, graph2)
# [1] FALSE

graphgraph2 对象包含环境,每次生成环境时,即使它具有相同的值,它也是不同的。如果 R 列表具有相同的内容,则它们是相同的。这可以通过说环境除了它们的值之外还具有对象标识,而列表的值形成列表的标识。尝试:

dput(graph)

给出以下内容,其中包括 dput 输出中由 <environment> 表示的环境:(输出后继续)

...snip...
), class = "factor")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
-150L), class = "data.frame"), layers = list(), scales = <environment>, 
    mapping = structure(list(x = Species, y = Sepal.Length), .Names = c("x", 
    "y"), class = "uneval"), theme = list(), coordinates = <environment>, 
    facet = <environment>, plot_env = <environment>, labels = structure(list(
        x = "Species", y = "Sepal.Length"), .Names = c("x", "y"
    ))), .Names = c("data", "layers", "scales", "mapping", "theme", 
"coordinates", "facet", "plot_env", "labels"), class = c("gg", 
"ggplot"))

例如,考虑:

g <- new.env()
g$a <- 1

g2 <- new.env()
g2$a <- 1

identical(as.list(g), as.list(g2))
## [1] TRUE

all.equal(g, g2) # the values are the same
## [1] TRUE

identical(g, g2) # but they are not identical
## [1] FALSE