Kevin Carriere
Kevin Carriere

Reputation: 365

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

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.

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.

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

Upvotes: 24

Views: 874

Answers (1)

G. Grothendieck
G. Grothendieck

Reputation: 269346

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. This can be stated by saying that environments have object identity apart from their values whereas the values of the list form the identity of the list. Try:

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) # the values are the same
## [1] TRUE

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

Upvotes: 26

Related Questions