反向
我读到了一个很好的答案,关于如何将自我调整的文本放到条形图中:条形内可调整大小的文本grobs
在阅读了一些关于ggproto,特别是扩展格点上的小片段之后,我想知道为什么作者必须将setup_data例程定义如下:
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的复制粘贴
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)
# }所以我想我可以用以下方法来代替这个:
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的第二个参数来决定吗?
发布于 2019-03-27 10:24:47
我没有参与ggplot2包的开发,但是我会尝试一下,因为它已经一个星期了&到目前为止还没有其他人发布.
下面是我从ggplot2 2的GitHub页面复制的相关函数定义。
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并不重要。
话虽如此,我可能会用这样的方法:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = .subset2(GeomBar, "setup_data"))或者这个:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = environment(GeomBar$setup_data)$f)使得代码更短。
https://stackoverflow.com/questions/55282193
复制相似问题