为什么两个 ggplot 对象通过 all.equal() 测试,但未通过 identical() 测试?
Why do two ggplot objects pass an all.equal() test, but fail identical() test?
我想测试 ggplot 生成的两个图形是否相同。一种选择是在绘图对象上使用 all.equal
,但我宁愿进行更严格的测试以确保它们相同,这似乎是 identical()
为我提供的东西。
但是,当我测试使用 same data
和 same 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
graph
和 graph2
对象包含环境,每次生成环境时,即使它具有相同的值,它也是不同的。如果 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
我想测试 ggplot 生成的两个图形是否相同。一种选择是在绘图对象上使用 all.equal
,但我宁愿进行更严格的测试以确保它们相同,这似乎是 identical()
为我提供的东西。
但是,当我测试使用 same data
和 same 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
graph
和 graph2
对象包含环境,每次生成环境时,即使它具有相同的值,它也是不同的。如果 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