Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从父类调用setup\u数据_R_Ggplot2_Ggproto - Fatal编程技术网

R 从父类调用setup\u数据

R 从父类调用setup\u数据,r,ggplot2,ggproto,R,Ggplot2,Ggproto,回击 我正在阅读这篇关于如何将自我调整文本放入条形图的优秀答案: 在阅读了一些关于ggproto的内容,特别是关于的小插曲之后,我想知道为什么作者必须定义setup\u data例程,如下所示: GeomFit <- ggproto("GeomFit", GeomRect, setup_data = function(data, params) { data$width <- data$width %||%

回击

我正在阅读这篇关于如何将自我调整文本放入条形图的优秀答案:

在阅读了一些关于
ggproto
的内容,特别是关于的小插曲之后,我想知道为什么作者必须定义
setup\u 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
                 )
               })
所以我想我可以简单地用以下方式来代替:

GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = function(self, data, params)
                      ggproto_parent(GeomBar, self)$setup_data(data, params))

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

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

或者这个:

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

这就是我所说的极好的答案。非常感谢你。它不仅回答了我的问题,而且给了我非常有用的见解,我还没有意识到,特别是
[[
aka
.subset2
的非分派形式,以及如何通过环境访问
设置数据。再一次,世界级的答案!+1(如果我可以的话,更多!)
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)
}
GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = .subset2(GeomBar, "setup_data"))
GeomFit <- ggproto("GeomFit", GeomRect,
                   setup_data = environment(GeomBar$setup_data)$f)