2016-04-01 8 views
2

私のパッケージMomocsのS3オブジェクトを検証する方法を探しています。S3の柔軟性とS4の表現チェックを組み合わせることはできますか?

以前のバージョンのパッケージはS4を使用して書かれていましたが、柔軟性のために私はS3に戻っていました。なぜなら私は本当に多重継承を必要としないからです。etc.。この変更の主なコストは、実際にはS4表現/有効性チェックを失っていました。

私の問題は次のとおりです。たとえば、既存のメソッドを拡張しようとするか、オブジェクト構造を操作するなど、S3オブジェクトの誤って「無効化」を防ぐにはどうすればよいですか?

私はすでにvalidateという関数を書いていますが、これまでのところ、重要なステップ、一般にオブジェクトをクラスから別のものに変換する前に検証しています。

私の質問は:私は私のケーキを持っていると(S3の柔軟性とS4表現のチェック)それを食べるために

  • したいですか?その場合、私のvalidate関数をパッケージのすべてのメソッドに追加する必要がありますか?
  • など、S3の上にスマートな方法があります。「特定のクラスのオブジェクトに対して何かを行うときはいつでも、validate関数を呼び出します。

答えて

2

最も簡単なことは、各クラスの検証関数を作成し、S3メソッドのディスパッチ前または各クラスのメソッド内でオブジェクトを渡すことです。ここでは、クラス"example_class"のオブジェクトのcheck_example_classと呼ばれる簡単な検証機能を備えた例を示します

check_example_class <- function(x) { 
    stopifnot(length(x) == 2) 
    stopifnot("a" %in% names(x)) 
    stopifnot("b" %in% names(x)) 
    stopifnot(is.numeric(x$a)) 
    stopifnot(is.character(x$b)) 
    NULL 
} 
print.example_class <- function(x, ...) { 
    check_example_class(x) 
    cat("Example class object where b =", x$b, "\n") 
    invisible(x) 
} 

# an object of the class 
good <- structure(list(a = 1, b = "foo"), class = "example_class") 

# an object that pretends to be of the class 
bad <- structure(1, class = "example_class") 

print(good) # works 
## Example class object where b = foo 
print(bad) # fails 
## Error: length(x) == 2 is not TRUE 
+0

私はすでに、このような[もの](https://github.com/vbonhomme/Momocs/blob/master/R/を持っていますcl-validate.R)しかし、どこにでも追加するのを避けることができるかどうかを知りたいのですが。 'print'でコーニングするのはとても良いトリックです! –

+1

@VincentBonhomme S3対S4のトレードオフです。 S3は文字どおりクラス属性から送出されるため、手動で検証する必要があります。あらゆる種類の検証のための他のインフラストラクチャを提供していません。 – Thomas

関連する問題