S3 クラスと S4 クラスの両方を実装する必要がある汎用関数を定義する良い方法は何ですか? 私はこのようなものを使用しています:
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setMethod("myfun", "ANY", function(x, ...) {
if(!isS4(x)) {
return(UseMethod("myfun"));
}
stop("No implementation found for class: ", class(x));
});
これは成功します:
myfun.bar <- function(x, ...){
return("Object of class bar successfully dispatched.");
}
object <- structure(123, class=c("foo", "bar"));
myfun(object)
これを達成するための「ネイティブ」な方法はありますか?を使用して S3 クラスの S4 メソッドを定義できることはわかっていますがsetOldClass
、この方法では、オブジェクトに複数のクラスがある場合に S3 メソッドのディスパッチが失われます。例 (クリーン セッションの場合):
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setOldClass("bar")
setMethod("myfun", "bar", function(x, ...){
return("Object of class bar successfully dispatched.");
});
object <- structure(123, class=c("foo", "bar"));
myfun(object)
の 2 番目のクラス (object
この場合bar
は ) が無視されるため、これは失敗します。foo
と の間で正式な S4 継承を定義することでおそらくこれを修正できますbar
が、私のアプリケーションではmyfun.bar
、 class を使用して S3 オブジェクトをそのまま使用したいと考えていますbar
。
いずれにせよ、物事は混乱しています。これは一般的な問題だと思います。おそらくこれを行うためのより良い方法がありますか?