3

クラスの新しいdataメソッドを定義しようとしています。foofooのオブジェクトは次の構造に従います。

setClass(Class = "foo", 
    representation = representation(
        data = "data.frame", 
        id = "character",   
        wl = "numeric"
    )
)

data私が作成しようとしているメソッドは、実際にはスロットの内容にアクセスしています@data:

setMethod("data", "foo",
    function(object)
        object@data
)

Writing R Extensions マニュアルのセクション 7.1を見てきましたが、S3 クラスしか扱っていません。私もこの投稿をのぞき見しましたが、成功しませんでした:

setGeneric("data", function(object, ...) standardGeneric('data'))

setMethod("data", "ANY", utils::data)

setMethod("data", "foo",
  function(object)
    object@data
)

パッケージをロードするとき:

> data(mtcars)
Error in function (classes, fdef, mtable)  : 
  unable to find an inherited method for function "data", for signature "data.frame"
4

2 に答える 2

5

ピエール、

の最初の引数data...object!ではない)なので、ディスパッチには特別な考慮が必要です。? dotsMethodsそれについて説明します。

多くの場合(たとえばcbindrbind)、迅速で汚い解決策は、これらの関数にS3メソッド表記を使用することです。

data.foo <- function (...) {
   x <- list (...) [[1]]
   x@data
} 

ただし、元のデータ関数が引数の未評価の名前を使用し、エラーメッセージがそれが評価されていることを示唆しているため、ここで問題が発生していると思います(意味があります:引数が評価されていない場合、Rはどのクラスを持っているかをどのように知ることができますか?評価しますか?)元のデータ関数が呼び出される前に。

したがって、最終的には、データ()以外の名前を使用してデータスロットにアクセスする方がはるかに簡単な場合があります。

(あなたのwlスロットは私に波長を考えさせます:あなたが分光データのためのクラスをセットアップしているなら、hyperSpecを見てください-それはあなたがすでに必要とするものを提供するかもしれません)。

于 2011-07-04T06:39:21.263 に答える
0

私(私は世界にいます)を助けたのは、基本パッケージからS3呼び出すデフォルト関数を作成することでした:data()utils

data.default <- function(...){
 utils::data(...)
}

次に、ディスパッチは期待どおりに動作します。

data(mtcars)
mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
于 2013-10-24T12:53:20.290 に答える