4

私のパッケージでは、提供さTheBaseClassれたパッケージからクラスをサブクラス化したいです (そのため、私の手の届かないところにあります)。このクラスのオブジェクトを作成する関数があります。そのコードの最小限の例を次に示します。

setClass("TheBaseClass", representation(a="numeric"))
initBase <- function() new("TheBaseClass", a=1)  # in reality more complex

サブクラスのコンストラクターとして単純に使用したいのですinitBaseが、新しいクラスを設定する方法がわかりません

setClass("MyInheritedClass", contains="TheBaseClass")
initInher <- function() {
    res <- initBase()
    class(res) <- "MyInheritedClass" # this does not work for S4
}

最後の行を変更して機能させるにはどうすればよいですか? 関数のコピーと貼り付けは、呼び出しinitBaseを伴うため、オプションではありません。.Cについて読みましsetIsたが、これは適切な機能ではないようです。

どんなヒントでも大歓迎です!

4

1 に答える 1

4

おそらく、この答えはより広範な説明を提供します。1 つのパターンは、基底クラスのインスタンスを名前のない引数としてクラス コンストラクターに提供することです。

.MyInheritedClass <- setClass("MyInheritedClass", contains="TheBaseClass")
.MyInheritedClass(initBase())

(setClassジェネレーター関数を返します。これは、呼び出しと実際には違いはありませんが、よりnewクリーンに見えます。.ジェネレーターは「エンドユーザー」にとっては少し粗雑すぎるため、前に使用します。たとえば、引数がどうあるべきかについてのヒントがないためです。 、ちょうど...)。これは、クラスの初期化メソッドを作成していないか、初期化メソッドが initialize,ANY-method のコントラクトと一致する方法で構築されており、少し複雑なクラスを使用していることを前提としています。

.A <- setClass("A", contains="TheBaseClass",
    representation=representation(x="numeric"))

setMethod(initialize, "A",
   function(.Object, ..., x)
{
    x <- log(x)                          # your class-specific initialization...
    callNextMethod(.Object, ..., x = x)  # passed to parent constructor
})

このパターンでは、基本クラスの初期化メソッドが正しく設計されている必要があります。実際に:

> .A(initBase(), x=1:2)
An object of class "A"
Slot "x":
[1] 0.0000000 0.6931472

Slot "a":
numeric(0)
于 2013-05-11T00:42:31.103 に答える