从 parent class 调用 setup_data
Call setup_data from parent class
背景
我正在阅读关于如何将自调整文本放入栏中的优秀答案:
阅读了一些关于 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
的 parent class 是 GeomRect
和 不是GeomBar
。
问题
使用 ggproto_parent
从不是 [=55 的 class 调用函数是否可以(从某种意义上说:没有可能导致问题的条件) =] class 我的 ggproto
object?为什么 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)
在这种情况下会 return 两个项目的列表,list(parent = GeomBar, self = self)
(其中 self 解析为 GeomFit
) .此列表作为 x
.
传递给第二个函数
第二个函数然后在 x[["parent"]]
中搜索与给定名称对应的方法,在本例中为 setup_data
(fetch_ggproto
),并将其与 [=21= 相关联] 如果相关函数包含 self
参数 (make_proto_method
)。
两个函数都不会检查 GeomFit
的父级(可以在 GeomFit$super()
访问),所以我不认为 GeomBar
而不是 GeomRect
ggproto_parent()
真的很重要。
也就是说,我可能会使用这样的东西:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = .subset2(GeomBar, "setup_data"))
或者这个:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = environment(GeomBar$setup_data)$f)
这使得代码更短。
背景
我正在阅读关于如何将自调整文本放入栏中的优秀答案:
阅读了一些关于 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
的 parent class 是 GeomRect
和 不是GeomBar
。
问题
使用 ggproto_parent
从不是 [=55 的 class 调用函数是否可以(从某种意义上说:没有可能导致问题的条件) =] class 我的 ggproto
object?为什么 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)
在这种情况下会 return 两个项目的列表,list(parent = GeomBar, self = self)
(其中 self 解析为 GeomFit
) .此列表作为 x
.
第二个函数然后在 x[["parent"]]
中搜索与给定名称对应的方法,在本例中为 setup_data
(fetch_ggproto
),并将其与 [=21= 相关联] 如果相关函数包含 self
参数 (make_proto_method
)。
两个函数都不会检查 GeomFit
的父级(可以在 GeomFit$super()
访问),所以我不认为 GeomBar
而不是 GeomRect
ggproto_parent()
真的很重要。
也就是说,我可能会使用这样的东西:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = .subset2(GeomBar, "setup_data"))
或者这个:
GeomFit <- ggproto("GeomFit", GeomRect,
setup_data = environment(GeomBar$setup_data)$f)
这使得代码更短。