3

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

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

data我试图创建的方法实际上是访问@data插槽的内容:

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

我一直在查看编写 R 扩展手册的第 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 怎么知道参数具有哪个类评估?)在调用原始数据函数之前。

因此,最后使用 data() 之外的其他名称可能更容易访问您的数据槽。

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

于 2011-07-04T06:39:21.263 回答
0

帮助我(我在世界上)的是创建从基本包S3调用的默认函数:data()utils

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

然后 dispatch 按预期运行:

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 回答