Reputation: 365
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
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