2

S4 クラスをサブクラス化し、そのサブクラスに特別なメソッドを追加したいと考えています。メソッドはサブクラスに対してのみ機能するはずです。アプリケーション内の他のクラスでは意味がありません。

    setClass("MySpecies", contains="Species", ##Species is an S4 class
         representation(x="numeric"))

setMethod("initialize", "MySpecies", function(.Object, x, ...){
  .Object@x <- x
  args <- list(...)
  for(i in seq_len(length(args))){
    attr(.Object, names(args)[i]) <- args[[i]]
  }
  .Object
})

##CalcMatrix <- function(.Object, y){
##  x <- .Object@x
##  matrix(x, x*2, y*3)
##}

setGeneric("CalcMatrix", function(object, y){standardGeneric("CalcMatrix")})
setMethod("CalcMatrix", "MySpecies",function(object, y){
  x <- object@x
  matrix(x, x*2, y*3)
})

それはsetGeneric機能しますが、このオブジェクトでのみ使用されますが、本当にジェネリック関数を定義する必要がありますか? コメントアウトされた部分は機能しますが、関数が正しい引数で呼び出されているかどうかはチェックされません。これを行う正しい方法は何ですか?前もって感謝します。

4

1 に答える 1

3

メソッドディスパッチを使用したいのですが、すべてのメソッドをジェネリックに関連付ける必要があるため、setGeneric必須です。

そして、ちょっとしたアドバイスを求めて... 正式なクラスシステムを使用して (おそらく、適切に定義されたクラスがより複雑なプログラムを作成するのに役立つため)、任意の属性を追加して構造を覆すのは少し奇妙です。これらは実際には、クラス内の明確に定義された追加のスロットである必要があります。

定義して、例を再現可能にしましょうSpecies

setClass("Species", representation(y="numeric"))
setClass("MySpecies", contains="Species", ##Species is an S4 class
         representation(x="numeric"))

S4 クラスの暗黙の要件は、それが機能することnew("MySpecies")です。initializeメソッドはこのテストに失敗します (デフォルトx値がないため)。さらに、初期化によって含まれるクラスMySpeciesのメソッドが呼び出されることを期待するのが一般的な方法です。initialize書くことができます

setMethod("initialize", "MySpecies", function(.Object, ..., x=numeric()) {
    callNextMethod(.Object, x=x, ...)
})

callNextMethod基本クラスが適切に初期化されるように注意してください。それを使用...してに渡すことcallNextMethodは、で定義されている可能性のあるスロットSpeciesも正しく初期化されることを意味します。また、は含まれているクラスを表す名前のない引数を取るように定義されているため、 のx後にある必要があります --は、直接使用しない引数を構築する方法であっても、機能する必要があります。上記のメソッドは、実際にはデフォルトの初期化メソッド以上のことは何もしないので、実際には (これはよくあることですが) 初期化メソッドをまったく書かない方が理にかなっています。...initializenew("MySpecies", new("Species"))initialize

そして、最近のRではsetClass、デフォルトのコンストラクターを返すので、

MySpecies <- setClass("MySpecies", contains="Species", ##Species is an S4 class
                      representation(x="numeric"))

その後

> MySpecies(x=1:5, y=5:1)
An object of class "MySpecies"
Slot "x":
[1] 1 2 3 4 5

Slot "y":
[1] 5 4 3 2 1
于 2013-01-19T23:55:03.530 に答える