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

Pie*_*rre 3 r s4

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

setClass(Class = "foo", 
    representation = representation(
        data = "data.frame", 
        id = "character",   
        wl = "numeric"
    )
)
Run Code Online (Sandbox Code Playgroud)

data方法我试图创造实际访问的内容@data槽:

setMethod("data", "foo",
    function(object)
        object@data
)
Run Code Online (Sandbox Code Playgroud)

我一直在查看Writing R Extensions手册的第7.1节,但它只涉及S3类.我也看过这篇文章,但没有成功:

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

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

setMethod("data", "foo",
  function(object)
    object@data
)
Run Code Online (Sandbox Code Playgroud)

加载包装时:

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

cbe*_*ica 5

皮埃尔

第一个参数data...(不是object!),因此您需要对调度进行一些特殊考虑.? dotsMethods讨论这个.

常(例如cbind,rbind),快速和肮脏的解决方案是使用S3方法表示法用于这些功能

data.foo <- function (...) {
   x <- list (...) [[1]]
   x@data
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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