首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从父类调用setup_data

从父类调用setup_data
EN

Stack Overflow用户
提问于 2019-03-21 14:01:54
回答 1查看 112关注 0票数 3

反向

我读到了一个很好的答案,关于如何将自我调整的文本放到条形图中:条形内可调整大小的文本grobs

在阅读了一些关于ggproto,特别是扩展格点上的小片段之后,我想知道为什么作者必须将setup_data例程定义如下:

代码语言:javascript
复制
GeomFit <- ggproto("GeomFit", GeomRect,
               setup_data = function(data, params) {
                 data$width <- data$width %||%
                   params$width %||% (resolution(data$x, FALSE) * 0.9)
                 transform(data,
                           ymin = pmin(y, 0), ymax = pmax(y, 0),
                           xmin = x - width / 2, xmax = x + width / 2, width = NULL
                 )
               })

因为这本质上是来自ggplot2::GeomBar的复制粘贴

代码语言:javascript
复制
GeomBar$setup_data
# <ggproto method>
#   <Wrapper function>
#     function (...) 
# f(...)

#   <Inner function (f)>
#     function (data, params) 
# {
#     data$width <- data$width %||% params$width %||% (resolution(data$x, 
#         FALSE) * 0.9)
#     transform(data, ymin = pmin(y, 0), ymax = pmax(y, 0), xmin = x - 
#         width/2, xmax = x + width/2, width = NULL)
# }

所以我想我可以用以下方法来代替这个:

代码语言:javascript
复制
GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = function(self, data, params)
                      ggproto_parent(GeomBar, self)$setup_data(data, params))

这种方法有效,但我怀疑这是否会导致一些不必要的行为,仅仅因为GeomFit的父类是GeomRect而不是GeomBar

问题

使用ggproto_parent从不是我的ggproto对象的父类调用函数可以吗?为什么ggproto_parent一开始就有一个parent参数?父母不是应该由ggproto的第二个参数来决定吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 10:24:47

我没有参与ggplot2包的开发,但是我会尝试一下,因为它已经一个星期了&到目前为止还没有其他人发布.

下面是我从ggplot2 2的GitHub页面复制的相关函数定义。

代码语言:javascript
复制
ggproto_parent <- function(parent, self) {
  structure(list(parent = parent, self = self), class = "ggproto_parent")
}

`$.ggproto_parent` <- function(x, name) {
  res <- fetch_ggproto(.subset2(x, "parent"), name)
  if (!is.function(res)) {
    return(res)
  }

  make_proto_method(.subset2(x, "self"), res)
}

从第一个函数中,我们可以推断ggproto_parent(GeomBar, self)在本例中将返回两个项的列表,list(parent = GeomBar, self = self) (其中self解析为GeomFit)。这个列表作为x传递给第二个函数。

然后,第二个函数在x[["parent"]]中搜索与给定名称相对应的方法,在本例中为setup_data (fetch_ggproto),如果该函数包含self参数(make_proto_method),则将其与x[["self"]]关联。

两个函数都不检查GeomFit的父函数(可以在GeomFit$super()上访问),因此我认为在ggproto_parent()中使用GeomBar而不是GeomRect并不重要。

话虽如此,我可能会用这样的方法:

代码语言:javascript
复制
GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = .subset2(GeomBar, "setup_data"))

或者这个:

代码语言:javascript
复制
GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = environment(GeomBar$setup_data)$f)

使得代码更短。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55282193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档