2

2 つのスロット A と B を持つクラス "myClass" を作成したいとします。

今、A と B が同じ長さであることを保証する validObject 関数が必要です

same_length <- function(object){
    if(length(object@A)!=length(object@B)) {
        "vectors are not the same length"
     } else TRUE
}

setClass("myClass", representation(A="numeric", B="numeric"),
          validity=same_length)

初期化時にクラスが有効であることを保証する関数をどこかで見ました。

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

試してみるとエラーが送信されます

newObj <- new("myClass", A=c(1,2,3), B=c(1,2))

でももしそうなら

newObj <- new("myClass")
newObj@A <- c(1,2,3)
newObj@B <- c(1,2)

エラーはスローされません。新しいスロット割り当てが検証されないとすぐにエラーをスローするにはどうすればよいですか?

4

1 に答える 1

0

チェックを行う「置換メソッド」を記述します。これを行うには、汎用関数を作成する必要があります (適切な名前と署名を持つ関数が既に存在しないため)。

setGeneric("slotA<-", function(x, ..., value) standardGeneric("slotA<-"))

次に、処理したい特定のタイプのオブジェクトの置換メソッドを実装する必要があります。最初の引数はクラス 'myClass' で、2 番目の引数 ( value) はクラス 'numeric' です。

setReplaceMethod("slotA", c("myClass", "numeric"), function(x, ..., value) {
    x@A = value
    validObject(x)
    x
})

「ゲッター」ジェネリックとメソッドを書くこともできます

setGeneric("slotA", function(x, ...) standardGeneric("slotA"))
setMethod("slotA", "myClass", function(x, ...) x@A)

その後

> a=new("myClass", A=1:10, B=10:1)
> slotA(a)
 [1]  1  2  3  4  5  6  7  8  9 10
> slotA(a) = 1:5
Error in validObject(x) : 
  invalid class "myClass" object: vectors are not the same length

デフォルトのinitializeメソッドは を呼び出すことに注意してください。したがって、コンストラクターの最後の行としてcheckValidity使用する場合、有効性を明示的にチェックする必要はありません。callNextMethod

于 2012-06-21T16:05:55.083 に答える