2016-11-14 16 views
0

私はS4クラスmyclassを作成し、彼らは私が次のエラーメッセージが表示されますS4クラスのコンストラクタと検証

setClass("myclass", slot = c(x = "numeric")) 

#constructor 
ValidmyClass<- function(object, param = 1) 
{ 
if([email protected] == param) return(TRUE) 
else return("problem") 

} 
setValidity("myclass", ValidmyClass) 

setMethod("initialize","myclass", function(.Object,...){ 
.Object <- callNextMethod() 
validObject(.Object,...) 
.Object 
}) 

れるパラメータparamによって与えられた条件を確認する場合は、オブジェクトが作成されることを保証するために、短いコードを提示Error in substituteFunctionArgs(validity, "object", functionName = sprintf("validity method for class '%s'", : trying to change the argument list of for validity method for class 'myclass' with 2 arguments to have arguments (object)

私は議論の問題を理解していますが、私はこれを解決する方法を見つけることができません。 setValidityについてのドキュメントでは、引数のメソッドが「NULLまたは1つの引数(オブジェクト)の関数」である「有効性メソッド」である必要があると述べています。したがって、複数の議論を除いて私の理解から。

しかし、この例の背後にある考え方は、与えられた外部パラメータの値に基づいてmyclassオブジェクトの構築をテストできるようにすることです。さらに条件を追加する必要がある場合は、十分な柔軟性を求めて、機能を追加する必要がありません。スロットを追加する必要はありません。ValidmyClass

答えて

1

有効性関数には、objectという1つの引数が必要です。 1つの引数関数を作成する必要があるときに、実際に渡す引数やデータが増えたときは、しばしばクロージャを使用することに戻ります。ここではValidmyClassの実装が変更され、実際の有効性関数が返されるようになりました。囲み関数の引数は、あなたが興味を持っている追加の引数のセットです。

また、有効性関数はinitで自動的に呼び出されます。ただし、オブジェクトが作成された後にスロットxが変更された場合は無効になります。

setMethod("initialize", "myclass", function(.Object,...) { 
    .Object <- callNextMethod() 
    .Object 
}) 

new("myclass", x = 2) 
new("myclass", x = 1) 

クロージャの詳細については、adv-Rを参照してください。私はこれがあなたの質問に答えると思うが、私はこの実装が実際にどのように役立つかはわかりません。クラスを定義するとき、基本的には、有効性関数が知っている追加のパラメータも修正します。妥当性関数を抽象化できる複数のクラスがある場合は、クロージャを使用します。実行時にパラメータを変更する1つのクラスがある場合は、クラスにスロットを追加することを検討します。クラス定義を変更しない場合は、クラスのリストを追加することができます。ここで、テストする値の任意の数を渡すことができます。

関連する問題