ggplotGrob对象上的cbind失败并显示“mmm中的错误< each:未实现这些类型的比较”

时间:2017-11-14 06:17:23

标签: r r-grid gtable r-lemon

这似乎与@baptiste在2014年试图解决的问题相似。我正在重新审视我在6月写回的代码,其中包括创建三个ggplotGrobs并将它们与cbind的调用相结合。现在,此代码失败并显示以下消息:“mmm中的错误< each:未实现这些类型的比较。”

我认为这将特定于我的特定应用程序,但我能够制作一个非常简单,可重现的示例。即使cbind是在两个相同的ggplotGrobs上执行的,这段代码仍然会失败。

library(ggplot2)
library(gtable)

# Make some plots
pl1 <- ggplot(mtcars, aes(x = disp, y = mpg)) +
    geom_point()
pl2 <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) +
    geom_point()

# Convert to grobs
pl1_grob <- ggplotGrob(pl1)
pl2_grob <- ggplotGrob(pl2)

# Bind them together -- Error!
combined_grob <- cbind(pl1_grob, pl2_grob)

错误和相关回溯在这里:

> combined_grob <- cbind(pl1_grob, pl2_grob)
Error in mmm < each : comparison of these types is not implemented
> traceback()
8: comp(x_val, y_val)
7: unit(comp(x_val, y_val), x_unit)
6: compare_unit(x$heights, y$heights, pmax)
5: cbind_gtable(x, y, size = size)
4: f(init, x[[i]])
3: Reduce(function(x, y) cbind_gtable(x, y, size = size), gtables)
2: cbind(deparse.level, ...)
1: cbind(pl1_grob, pl2_grob)

此代码在OS X 10.11.6上使用R-3.4.2,使用grid_3.4.2,gtable_0.2.0和ggplot2_2.2.1,在Linux上使用R-3.3.2(在Ubuntu 16.04上从源代码编译), grid_3.3.2,gtable_0.2.0和ggplot2_2.2.1。

在做上面的例子之前,我注意到“lemon”包中的一个小插图(“gtable_show_lemonade”)在最后一个附近失败,在两个gtables的cbind上出现相同的错误。我通过从源代码运行此插图的代码来确认此错误,如下所示:

library(lemon)
edit(vignette('gtable_show_lemonade', package = 'lemon'))
# Then use whichever editor you opened to copy the temporary filename
# of the vignette source, and run this with source()

编译后的插图(cbind失败)在这里:https://cran.r-project.org/web/packages/lemon/vignettes/gtable_show_lemonade.html

使用在OS X 10.11(El Capitan)上运行的上述R-3.4.2实例获得晕影编译期间的失败。

感谢你解决这个问题的任何帮助!由于我想使用我的Mac来生成数字(更好的字体情况),我希望有一种方法可以重载一个函数来解决这个问题。

更新:

如果指定了size = 'max'(默认值为size = 'min'),这只是“问题”。我认为我可以使用size = 'first'size = 'last'来解决它,它不会执行有问题的高度比较,但默认行为不起作用肯定不方便(并且在某些情况下size = 'max'很有用。)

1 个答案:

答案 0 :(得分:5)

我从未设法在gtable中修复此问题,因此gridExtra有一个名为gtable_cbind的修改版本。