2012-03-31 7 views
1

は、次のS4クラスを考えてみましょう:クラススロット対署名の不一致を初期化

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

setMethod('initialize', 'Foo', 
     function(.Object, a, b) { 
     [email protected] <- 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の署名は、クラスにあるスロットと一致する必要があります。それ以外の場合は、発生するのを待っている問題です。私が間違っている?

答えて

3

引数がないとnewが呼び出され、new("Foo")が動作する必要があります。また、...callNextMethodとし、の後に(initializeは含まれているクラスを初期化するために文書化されているため)の引数を持つ方がよいでしょう。だから、

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

は通常1は、新たな呼び出しからユーザーを絶縁したい、と代わりにコンストラクタFooを使用します。典型的には、コンストラクタは、あなたが代わりにinitializeメソッドに入れた強制を行います。したがって、initializeメソッドは指定されていません。

Foo <- function(a=integer(), b=integer(), ...) { 
    model <- data.frame(a, b) 
    new("Foo", model=model, ...) 
} 
関連する問題