如何使用do.call向ggplot对象添加元素?

时间:2017-04-07 09:50:25

标签: r ggplot2

异议

我想使用do.call将图层列表e与主图g合并。 我的目的是使用annotation_custom(ggplotGrob(x))个对象(其中x是一个独立的ggplot个对象) 用。覆盖主图。

  • e:课程LayerInstance / Layer / ggproto
  • 的对象
  • g:课程gg / ggplot
  • 的对象

简化问题

此简化示例使用e函数调用列表geom_*

library(ggplot2)
# data
d <- data.frame(a = 1:3, x = 1:3, y = 1:3)
# main plot
g <- ggplot(d, aes(x, y, label = a))
# plot elements
e <- list(geom_point(), geom_text())

不受欢迎的解决方案

要将情节ge中的所有元素相结合,我可以使用单个元素(有效),如下所示:

g + e[[1]] + e[[2]]

但我的目的是(出于自动化原因)使用do.call

问题

do.call+一起使用以及ge列表失败:

do.call(`+`, c(list(g), e))
# Error in .Primitive("+")(list(data = list(a = 1:3, x = 1:3, y = 1:3),  : 
#   unused argument (<environment>)

问题

如何正确使用do.call+方法以及ge列表?

3 个答案:

答案 0 :(得分:2)

我认为你不需要do.calldo.call使用您提供的列表将其作为函数中的参数运行。 +只需要2个参数。如果您希望使用+进行链接,Reduce可以使用相同的呼叫完成工作。

Reduce(`+`, c(list(g), e))

输出:

enter image description here

答案 1 :(得分:1)

只是g + e出了什么问题?

答案 2 :(得分:1)

这也有效:

do.call(`+`, c(list(g), list(e)))