使用data()作为通用S4函数

时间:2011-07-04 02:54:52

标签: r s4

我正在尝试为data类定义新的foo方法。我的foo个对象遵循以下结构:

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

我正在尝试创建的data方法实际上是访问@data广告位的内容:

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

我一直在查看Writing R Extensions手册的section 7.1,但它只涉及S3类。我也看了this post,但没有成功:

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"

2 个答案:

答案 0 :(得分:5)

皮埃尔

data的第一个参数是...(不是object!),因此您需要对发送进行一些特殊考虑。 ? dotsMethods讨论了这个问题。

经常(例如cbindrbind),快速&脏解决方案是对这些函数使用S3方法表示法

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

但是,我猜你在这里遇到了麻烦,因为原始数据函数使用了参数的未评估名称,并且错误消息表明它已被评估(确实有意义:R如何知道参数具有哪个类,如果它在调用原始数据函数之前不评估?)。

因此,最后使用其他名称而不是data()来访问数据槽可能要容易得多。

(你的wl插槽让我想到波长:如果你正在为光谱数据设置一个类,看看hyperSpec - 它可能已经提供了你需要的东西。

答案 1 :(得分: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