thisに関連していますが、若干異なります。S3オブジェクトのS3スタイルのディスパッチは、正式なメソッド定義を使用して
私は、S4クラスとS3クラスの両方でメソッドを正式に登録する方法を探していますが、ディスパッチのためのひどいS3-dot-naming-schemeに頼ることはありません。例:
setClass("foo");
setClass("bar");
setGeneric("test", function(x, ...){
standardGeneric("test");
});
setMethod("test", "bar", function(x, ...){
return("success (bar).");
});
obj1 <- 123;
class(obj1) <- "bar";
test(obj1);
この例では、我々は素晴らしいです機能test.bar
を、名前を付ける必要がなく、クラスbar
のS3オブジェクトに対してtest
メソッドを登録する方法を示しています。ただし、この方法で登録すると、オブジェクトの最初のS3クラスにのみディスパッチされます。例えば:S4メソッドのディスパッチが唯一のクラスfoo
とそのスーパークラスを尽くしますので
obj2 <- 123;
class(obj2) <- c("foo", "bar");
test(obj2);
これは、動作しません。 foo
の適切なメソッドが見つからない場合、bar
のtest
メソッドが自動的に選択されるように、この例をどのように拡張できますか?例えば。 S3スタイルのディスパッチがありますが、すべての名前付けに戻る必要はありませんtest.foo
とtest.bar
?
要約:正式なメソッドディスパッチを使用するジェネリック関数を作成する方法ですが、さらに複数のクラスを持つS3オブジェクトのオブジェクトの第2、第3などのクラスにフォールバックします。
setOldClass(c("foo", "bar"))
setGeneric("test", function(x, ...)standardGeneric("test"))
setMethod("test", "bar", function(x, ...)return("success (bar)."))
はい私は似たようなことをしています。しかし実際には、xのクラス属性を途中で実際に変更しているということは、望ましくない副作用を伴う可能性があります。オブジェクト自体を変更せずに次のメソッドにディスパッチできる方法はありますか? – Jeroen
私はあなたに答えがありません。私はS3クラス 'bar'で動作する 'bar'のS4メソッドは実装の事故であり、非常に不安定な基盤上で複雑な構造を構築していると思います。 –