在S4泛型方法中使用S3对象会导致错误

时间:2015-04-10 14:03:59

标签: r s4

这是Hadley's advanced R book:

的示例
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

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

此问题是由S3和S4类系统之间的混乱引起的。 foo是S3类(它是由setOldClass而不是setClass创建的),因此,当以+作为第一个参数调用它时,它将尝试S3方法分派(寻找一个函数+.foo)。这就是为什么注释中有关定义此类功能的建议可以解决此问题的原因。

如果foo是“纯S4”类(即,它具有插槽并且是通过setClass创建的),则您的代码将起作用。