当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R ggplot2 ggproto 创建一个新的 ggproto 对象


使用 ggproto() 构造一个新对象,使用 is.ggproto() 进行测试,并使用 ggproto_parent() 访问父方法/字段。

用法

ggproto(`_class` = NULL, `_inherit` = NULL, ...)

ggproto_parent(parent, self)

is.ggproto(x)

参数

_class

分配给对象的类名。这被存储为对象的类属性。这是可选的:如果NULL(默认值),则不会将类名添加到对象中。

_inherit

要继承的 ggproto 对象。如果是 NULL ,则不要从任何对象继承。

...

ggproto 对象中的成员列表。

parent, self

访问对象 self 的父类 parent

x

要测试的对象。

细节

ggproto 实现了一个基于原型的 OO 系统,它模糊了类和实例之间的界限。它的灵感来自于原型包,但它有一些重要的区别。值得注意的是,它完全支持跨包继承,并且具有更快的性能。

在大多数情况下,创建一个供单个包使用的新的面向对象系统并不是一个好主意。然而,它是 ggplot2 中最不糟糕的解决方案,因为它需要对已经很复杂的代码库进行最少的更改。

调用方法

ggproto 方法可以采用可选的 self 参数:如果存在,则它是常规方法;如果不存在,则它是 "static" 方法(即它不使用任何字段)。

假设您有一个 ggproto 对象 Adder ,它有一个方法 addx = function(self, n) n + self$x 。然后,要调用此函数,您将使用Adder$addx(10)——self由包装函数自动传入。 self 可以位于函数签名中的任何位置,尽管通常它位于最前面。

调用父级中的方法

要显式调用父级中的方法,请使用 ggproto_parent(Parent, self)

例子

Adder <- ggproto("Adder",
  x = 0,
  add = function(self, n) {
    self$x <- self$x + n
    self$x
  }
 )
is.ggproto(Adder)
#> [1] TRUE

Adder$add(10)
#> [1] 10
Adder$add(10)
#> [1] 20

Doubler <- ggproto("Doubler", Adder,
  add = function(self, n) {
    ggproto_parent(Adder, self)$add(n * 2)
  }
)
Doubler$x
#> [1] 20
Doubler$add(10)
#> [1] 40
源代码:R/ggproto.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Create a new ggproto object。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。