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


R new 从类生成对象


R语言 new 位于 methods 包(package)。

说明

new 的调用返回第一个参数标识的类中新分配的对象。此调用依次调用与指定类对应的泛型函数 initialize 的方法,并将 ... 参数传递给该方法。在 initialize() 的默认方法中,命名参数为相应的槽提供值,未命名参数必须是来自此类的超类的对象。

对类的生成函数的调用(请参阅 setClass )会将其 ... 参数传递给对 new() 的相应调用。

用法

new(Class, ...)

initialize(.Object, ...)

参数

Class

类的名称、 character 字符串(通常情况)或说明该类的对象(例如 getClass 返回的值)。请注意,从生成函数传递的字符串包括包名称作为属性,以避免两个包具有相同名称的类时出现歧义。

...

用于指定新对象属性的参数,传递给 initialize()

.Object

对象:请参阅“Initialize Methods”部分。

初始化方法

不直接调用通用函数initialize。对new 的调用首先从类定义中复制原型对象,然后使用该对象作为第一个参数调用intialize(),后跟...参数。

通过为 "initialize" 定义适当的方法,对生成器函数或 new() 调用中的 ... 参数的解释可以专门针对特定类。

在默认方法中,... 中的未命名参数被解释为来自超类的对象,命名参数被解释为要分配到相应命名槽中的对象。显式指定的槽会覆盖同一槽的继承信息,无论参数出现的顺序如何。

initialize 方法不必将 ... 作为第二个参数(请参阅示例)。当说明新对象的自然参数不是槽的名称时,通常会编写初始化方法。如果您确实定义了这样的方法,则应包含 ... 作为形式参数,并且您的方法应通过 callNextMethod 传递此类参数。这有助于定义您的类的未来子类。如果它们有额外的槽,并且您的方法没有此参数,则这些槽将很难包含在初始化调用中。

有关某些类与现有方法的讨论,请参阅initialize-methods

initialize 的方法只能通过简单继承来继承,因为要求该方法从目标类返回一个对象。有关一般概念,请参阅 setGenericsimpleInheritanceOnly 参数以及 setIs 中的讨论。

请注意,基本向量类 "numeric" 等是隐式定义的,因此可以对这些类使用 new 。 ... 参数被解释为这种类型的对象,并连接到结果向量中。

例子

## using the definition of class "track" from \link{setClass}



## a new object with two slots specified
t1 <- new("track", x = seq_along(ydata), y = ydata)

# a new object including an object from a superclass, plus a slot
t2 <- new("trackCurve", t1, smooth = ysmooth)

### define a method for initialize, to ensure that new objects have
### equal-length x and y slots.  In this version, the slots must still be
### supplied by name.

setMethod("initialize", "track", 
    function(.Object, ...) {
      .Object <- callNextMethod()
      if(length(.Object@x) != length(.Object@y))
      stop("specified x and y of different lengths")
      .Object
    })

### An alternative version that allows x and y to be supplied
### unnamed.  A still more friendly version would make the default x
### a vector of the same length as y, and vice versa.

setMethod("initialize", "track",
          function(.Object, x = numeric(0), y = numeric(0), ...) {
              .Object <- callNextMethod(.Object, ...)
              if(length(x) != length(y))
                  stop("specified x and y of different lengths")
              .Object@x <- x
              .Object@y <- y
              .Object
          })


参考

Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)

也可以看看

Classes_Details 了解类定义的详细信息,setOldClass 了解与 S3 类的关系。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Generate an Object from a Class。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。