gpt4 book ai didi

r - 从父类调用 setup_data

转载 作者:行者123 更新时间:2023-12-04 01:45:51 25 4
gpt4 key购买 nike

背景

我正在阅读关于如何将自调整文本放入栏中的优秀答案:Resizeable text grobs inside bars

ggproto 上阅读了一下之后尤其是 Extending ggplot 上的小插图我想知道为什么作者必须定义 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首先争论? parent 不应该由 ggproto 的第二个参数决定吗? ?

最佳答案

我没有参与 ggplot2 包的开发,但我会尝试一下,因为已经一周了而且到目前为止还没有其他人发布...

以下是我从 ggplot2 的 GitHub page 中复制的相关函数定义:

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 ),并将它与 x[["self"]] 相关联,如果有问题的函数包含一个 self 参数(make_proto_method ).

这两个函数都不会检查 GeomFit 的父级(可以在 GeomFit$super() 访问),所以我不认为有 GeomBar 而不是 ggproto_parent() 中的 GeomRect 确实很重要。


也就是说,我可能会使用这样的东西:

GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = .subset2(GeomBar, "setup_data"))

或者这个:

GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = environment(GeomBar$setup_data)$f)

这使得代码更短。

关于r - 从父类调用 setup_data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55282193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com