2012-08-23 14 views
9

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) 

これは失敗します。私はおそらくfoobarの間の正式なS4継承を定義することでこれを修正することができましたが、myfun.barはクラスbarのS3オブジェクトの箱からすぐに使いたいと思っています。

いずれにしても、物事が乱雑になり、これが一般的な問題だと思いますので、おそらくこれを行うより良い方法がありますか?

+0

ベースRのS3ジェネリックにS4ディスパッチを追加する特殊なケースについては、http://stackoverflow.com/questions/12709933/adding-s4-dispatch-to-base-r-s3-genericも参照してください。 –

答えて

13

「メソッドのS3汎用関数」セクションでは、S3汎用、S3クラス用のS3スタイルのメソッド、およびS4メソッド自体を提案しています。

setClass("A")     # define a class 

f3 <- function(x, ...)   # S3 generic, for S3 dispatch  
    UseMethod("f3") 
setGeneric("f3")     # S4 generic, for S4 dispatch, default is S3 generic 
f3.A <- function(x, ...) {}  # S3 method for S4 class 
setMethod("f3", "A", f3.A)  # S4 method for S4 class 

S3クラスをディスパッチするには、S3一般が必要です。

setGeneric()はf3(S3ジェネリック)をデフォルトに設定し、f3、ANY-メソッドは実際にはS3ジェネリックです。 'ANY'はクラス階層のルート(ソート)にあるので、S4メソッドが存在しないオブジェクト(例えば、S3オブジェクト)はすべてS3ジェネリックに終わる。

S4クラスのS3ジェネリックの定義は、ヘルプページに記載されています。私は、S3はS4の方法については知らないと考えているので、S3 genericを呼び出すと(例えば、パッケージがS3 f3について知っているが、S4 f3については知っていないパッケージ名空間にあるため)、f3 generic S4方法が見つからない。私はメッセンジャーだけです。

+0

SoそれはS4の方法が最初に彼らの署名に基づいて探し出され、試合に失敗したことを意味し、S3の方法が派遣されますか? –

+0

@DWinはいそうです –

+0

最初と最後の行が必要な理由を詳しく説明できますか? – Jeroen

関連する問題