1

次の S4 クラスを検討してください。

setClass('Foo', representation(model='data.frame'))

setMethod('initialize', 'Foo',
      function(.Object, a, b) {
        .Object@model <- data.frame(a, b)
        .Object
      })

次の方法でインスタンス化できます。

new('Foo', a=1:4, b=4:7)

ここまでは順調ですね。ただし、Foo をサブクラス化しようとすると、エラーが発生します。

setClass('Bar', contains='Foo')
>>> Error in data.frame(a, b) : argument "a" is missing, with no default

個人的には、明示的な引数を使用してクラス Foo をインスタンス化することを好みます。これは、コードがより明示的であるためです。しかし、これは不可能に思えますね。の署名はinitialize、クラスが持つスロットと一致する必要があるようです。そうでない場合、発生するのを待っている問題です。私が間違っている?

4

1 に答える 1

3

要件は、new引数なしで呼び出されたが機能する必要があることnew("Foo")です。...また、初期化メソッドが、 to を取り、のcallNextMethod引数を持つことは、おそらくより良い方法です(含まれているクラスを初期化するために名前のない引数を使用することが文書化されているため)。そう...initialize

setMethod(initialize, "Foo", function(.Object, ..., a=integer(), b=integer()) {
    callNextMethod(.Object, ..., model=data.frame(a, b))
})

通常、ユーザーが new を呼び出さないようにする必要があり、代わりにコンストラクターを使用しFooます。通常、コンストラクターは、代わりに初期化メソッドに入れる可能性のある強制を実行するため、初期化メソッドは指定されていません。

Foo <- function(a=integer(), b=integer(), ...) {
    model <- data.frame(a, b)
    new("Foo", model=model, ...)
}
于 2012-04-01T11:28:09.827 に答える