manually - ¿Por qué dos objetos ggplot pasan una prueba all.equal() pero fallan la prueba idéntica()?
guides ggplot2 (1)
Quiero probar si dos gráficos generados por ggplot son iguales. Una opción sería usar all.equal
en los objetos de la trama, pero preferiría tener una prueba más dura para asegurar que son iguales, lo que parece es algo identical()
me proporciona.
Sin embargo, cuando probé dos objetos de trazado creados con los mismos data
y los mismos aes
, encontré que all.equal()
reconoce como iguales, mientras que los objetos no pasaron la prueba identical
. No estoy seguro por qué y me gustaría aprender más.
Ejemplo básico:
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
Los objetos graph
y graph2
contienen entornos y cada vez que se genera un entorno, es diferente incluso si contiene los mismos valores. Las listas R son idénticas si tienen los mismos contenidos, pero a diferencia de las listas, los entornos tienen identidad de objeto. Tratar:
dput(graph)
dando lo siguiente que incluye los entornos denotados por <environment>
en la salida dput
: (continua después de la salida)
...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"))
Por ejemplo, considere:
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