我正在尝试为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"
答案 0 :(得分:5)
皮埃尔
data
的第一个参数是...
(不是object
!),因此您需要对发送进行一些特殊考虑。 ? dotsMethods
讨论了这个问题。
经常(例如cbind
,rbind
),快速&脏解决方案是对这些函数使用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