Подтвердить что ты не робот

Почему два объекта ggplot проходят тест all.equal(), но не выполняют идентичный() тест?

Я хочу проверить, совпадают ли два графика, генерируемые ggplot. Один из вариантов заключается в использовании all.equal для объектов сюжета, но я бы предпочел более сложный тест, чтобы убедиться, что они одинаковы, что похоже на то, что мне предоставляет identical().

Однако, когда я протестировал два сюжетных объекта, созданных с тем же data и тем же 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
4b9b3361

Ответ 1

Объекты graph и graph2 содержат среды, и каждый раз, когда создается среда, она отличается, даже если она содержит одни и те же значения. R являются идентичными, если они имеют одинаковое содержимое, но в отличие от сред списков имеют идентификатор объекта. Попробуйте:

dput(graph)

дает следующее, которое включает среды, обозначенные <environment> в выводе dput: (продолжение после выхода)

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

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