當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。