setGeneric("type", function(x) standardGeneric("type"))
setMethod("type", signature("matrix"), function(x) "matrix")
setMethod("type", signature("character"), function(x) "character")
type(letters)
type(matrix(letters, ncol = 2))
foo <- structure(list(x = 1), class = "foo")
type(foo)
setOldClass("foo")
setMethod("type", signature("foo"), function(x) "foo")
type(foo)
setMethod("+", signature(e1 = "foo", e2 = "numeric"), function(e1, e2) {
structure(list(x = e1$x + e2), class = "foo")
})
foo + 3
除了最后一行之外,一切都按预期工作,这会在R 3.1.3中出现错误:
Error in foo + 3 : non-numeric argument to binary operator
知道发生了什么事吗?
答案 0 :(得分:0)
此问题是由S3和S4类系统之间的混乱引起的。 foo
是S3类(它是由setOldClass
而不是setClass
创建的),因此,当以+
作为第一个参数调用它时,它将尝试S3方法分派(寻找一个函数+.foo
)。这就是为什么注释中有关定义此类功能的建议可以解决此问题的原因。
如果foo
是“纯S4”类(即,它具有插槽并且是通过setClass
创建的),则您的代码将起作用。