为什么两个ggplot对象通过all.equal()测试,但是不能通过same()测试?

时间:2023-02-07 11:29:53

I want to test if two graphs generated by ggplot are the same. One option would be to use all.equal on the plot objects, but I'd rather have a harder test to ensure they're the same, which seems like is something identical() provides me.

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

However, when I tested two plot objects created with the same data and the same aes, I've found that all.equal() recognizes them as being the same, whereas the objects didn't pass the identical test. I'm not sure why and I'd love to learn more.

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

Basic example:

基本示例:

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

1 个解决方案

#1


23  

The graph and graph2 objects contain environments and each time an environment is generated it is different even if it holds the same values. R lists are identical if they have the same contents but unlike lists environments have object identity. Try:

graph和graph2对象包含环境,每次生成环境时,即使它具有相同的值,它也是不同的。如果R列表具有相同的内容但是列表环境具有对象标识,则R列表是相同的。尝试:

dput(graph)

giving the following which includes environments denoted by <environment> in the dput output: (continued after output)

在输出输出中给出以下包括 表示的环境:(输出后继续)

...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"))

For example, consider:

例如,考虑:

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)
## [1] TRUE

identical(g, g2)
## [1] FALSE

#1


23  

The graph and graph2 objects contain environments and each time an environment is generated it is different even if it holds the same values. R lists are identical if they have the same contents but unlike lists environments have object identity. Try:

graph和graph2对象包含环境,每次生成环境时,即使它具有相同的值,它也是不同的。如果R列表具有相同的内容但是列表环境具有对象标识,则R列表是相同的。尝试:

dput(graph)

giving the following which includes environments denoted by <environment> in the dput output: (continued after output)

在输出输出中给出以下包括 表示的环境:(输出后继续)

...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"))

For example, consider:

例如,考虑:

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)
## [1] TRUE

identical(g, g2)
## [1] FALSE