S3クラスとS4クラスの両方で実装する汎用関数を定義する良い方法はありますか?私はこのようなものを使用されています:S4とS3メソッドを1つの関数で結合する
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)
は、これを達成するための動き「ネイティブ」方法はありますか?私はsetOldClass
を使ってS3クラスのS4メソッドを定義することができますが、オブジェクトに複数のクラスがある場合にS3メソッドのディスパッチを失うことになります。例えば。 (クリーンセッションで):object
の第二のクラスは、この場合bar
には、無視されるので
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)
これは失敗します。私はおそらくfoo
とbar
の間の正式なS4継承を定義することでこれを修正することができましたが、myfun.bar
はクラスbar
のS3オブジェクトの箱からすぐに使いたいと思っています。
いずれにしても、物事が乱雑になり、これが一般的な問題だと思いますので、おそらくこれを行うより良い方法がありますか?
ベースRのS3ジェネリックにS4ディスパッチを追加する特殊なケースについては、http://stackoverflow.com/questions/12709933/adding-s4-dispatch-to-base-r-s3-genericも参照してください。 –