我正在尝试为类定义一个新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)
皮埃尔
第一个参数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 - 它可能已经提供了你需要的东西).