6

S4オブジェクトを含む任意のRオブジェクトで動作するS3メソッドを作成しています。

私が最初に理解していないのは、S4クラスがS4基本クラスから派生しているようには見えないため、ディスパッチメソッドをf <- function(x) UseMethod("f")宣言してすべてのS4オブジェクトを取得させることはできないということです。f.S4unclassS4オブジェクトの場合、クラスが指定されているように見えますS4。)ディスパッチをどのように管理する必要がありますか?

これらのS4オブジェクトを処理する最も簡単な方法は、それらをリストに変換することだと思われます。残念ながら、as.listエラーがスローされます(「このS4クラスをベクターに強制変換するメソッドはありません」)。

これは私のテストS4オブジェクトです:

library(gWidgetstcltk)
win <- gwindow()

関数S3Partとパッケージは有望に見えましたが、で使用すると両方ともエラーが発生しS3Classます。したがって、質問2は次のとおりです。S4オブジェクトをリストに変換する一般的な方法はありますか?methodswin

4

1 に答える 1

8

S4 はスーパークラス (仮想クラスなど) であり、直接ディスパッチを使用することはできません。ちなみにS3も同じ。S3 クラスの場合と同じように、S4 クラスの S3 ディスパッチを行うことができます。ちなみに、何も指定されていない場合myfun、S4 オブジェクトを呼び出すと .default 関数が呼び出されます。:

myfun <- function(object, ...) UseMethod("myfun")

myfun.default <- function(object,...){
    cat("default method.\n")
    print(object)
}

myfun.gWindow <- function(object,...){
    cat("Here here...")
    print(object)
}

x <- 1:10
myfun(x)
myfun(win)
rm(myfun.gWindow)
myfun(win)

すべての S4 メソッドをキャッチしたい場合は、.default 関数またはジェネリック関数で手動でディスパッチできますisS4()。.default 関数にディスパッチを追加すると、一部の S4 クラスへの自動 S3 ディスパッチが可能になります。ジェネリックに追加すると、すべての S4 no-matter-what にディスパッチするだけです。

    myfun.default <- function(object,...){
        if(isS4(object)) myfun.S4(object,...)
        else {
          cat("default method.\n")
          print(object)
        }
    }

    myfun.S4 <- function(object,...){
        cat("S4 method\n")
        print(object)
    }

x <- 1:10
myfun(x)
myfun(win)

2 番目の質問について:gWindowは特殊なケースです。また、 で試行するとエラーが返されますstr(win)。正確な構造はわかりませんが、通常の S4 オブジェクトではないことは間違いありません。

于 2011-05-06T15:25:39.407 に答える