是什么决定了 ggplot2 对象中 'flipped_aes' 的出现?

What determines the 'flipped_aes' occurence in ggplot2 objects?

我目前正在编写漩涡课程,其中我试图测试用户创建的 ggplot2 对象是否与我在自定义 AnswerTest 中创建的对象在某种程度上相等 (all.equal())。然而,我通过访问 e$val 从 swirl api 接收到的绘图对象通常继承了一个 flipped_aes = FALSE 属性,我无法在自己的绘图中创建该属性,因此 all.equal(e$val, someplot) 失败,尽管它们看起来相等.

我真的很感激一些关于如何解决它或控制它发生的想法!

如果发生 all.equal() 失败并显示以下消息:

"Component “layers”: Component 1: Component 4: Length mismatch: comparison on first 2 components"

我目前的测试是这样的:

calculates_same_graph <- function(expression){ #If ggplot expression must be written in curly brackets in Yaml file
   e <- get("e", parent.frame())
   eSnap <- cleanEnv(e$snapshot)
   
   val <- expression
   
   passed <- isTRUE(all.equal(val[-8], e$val[-8]))
   assign("e", e$val, envir = globalenv()) #only for diagnostics, changes 
                                           #when new answer is put in
   return(passed)
}

好吧,我同意这有点奇怪,但我发现 flipped_aes 参数仅在打印绘图后才存在。奇怪的是,这似乎是打印绘图的对象修改副作用。这只有在参数以某种方式被缓存时才有意义。

假设我们有两个具有相反美学翻转的情节:

library(ggplot2)

# Should have flipped_aes = FALSE
plot1 <- ggplot(iris, aes(Species, Sepal.Width)) +
  geom_col()

# Should have flipped_aes = TRUE
plot2 <- ggplot(iris, aes(Sepal.Width, Species)) +
  geom_col()

我们可以看到这些未打印的对象在它们的geom参数中没有flipped.aes

# Before printing plot
plot1$layers[[1]]$geom_params
#> $width
#> NULL
#> 
#> $na.rm
#> [1] FALSE

plot2$layers[[1]]$geom_params
#> $width
#> NULL
#> 
#> $na.rm
#> [1] FALSE

现在我们可以将这些图打印到一个临时文件中。只需在控制台中打印它也应该可以,我只是无法在 reprex 中复制它。

# Printing as tempfile
tmp <- tempfile(fileext = ".png")
png(tmp)
plot1
plot2
dev.off()
#> png 
#>   2
unlink(tmp)

现在我们打印绘图后,绘图对象突然有了 flipped_aes 参数。

# After printing plot
plot1$layers[[1]]$geom_params
#> $width
#> NULL
#> 
#> $na.rm
#> [1] FALSE
#> 
#> $flipped_aes
#> [1] FALSE

plot2$layers[[1]]$geom_params
#> $width
#> NULL
#> 
#> $na.rm
#> [1] FALSE
#> 
#> $flipped_aes
#> [1] TRUE

reprex package (v1.0.0)

于 2021 年 3 月 10 日创建

我不知道在你的漩涡测试中处理这种怪异现象的最佳方法是什么,但似乎打印的绘图会影响该参数。