是否可以定义从S3泛型分配多个参数的S4方法?

时间:2019-06-12 10:44:34

标签: r s4

我想定义一个包装类,该类将封装实际模型,并让用户使用新数据框或模型矩阵调用predict()

raw_model <- ...
model <- Model(raw_model)
X <- matrix(...)
predict(model, X)
df <- data.frame(...)
predict(model, df)

我认为这仅仅是为predict()定义两个方法,并根据前两个参数的类型进行分派:

library(methods)

Model <- setClass("Model", slots = "model")

setMethod("predict", signature("Model", "matrix"),
  function(object, newdata, ...) {
    stats::predict(object@model, newdata)
  })

setMethod("predict", signature("Model", "data.frame"),
  function(object, newdata, ...) {
    matrix <- model.matrix(newdata) # or something like that
    stats::predict(object@model, matrix)

})

但是,对setMethod的两次调用都失败了

Error in matchSignature(signature, fdef) : 
  more elements in the method signature (2) than in the generic signature (1) for function ‘predict’

我了解到S4泛型是从S3泛型predict创建的,其签名仅接受一个命名参数object,但是有一种方法可以使S4方法不仅仅用于此目的。第一个论点?

1 个答案:

答案 0 :(得分:0)

您可以使S4泛型分配多个参数,但不能(当前)分配命名参数和...。这是预测的问题-唯一的命名参数是object

您仍然可以通过以下方式定义自己的通用“一级降低”来实现所需的目标

predict2 <- function(model,newdata){stats::predict(model,newdata)}
setGeneric("predict2",signature=c("model","newdata"))

setMethod(
  "predict2",
  signature=c("Model","data.frame"),
  definition=function(model,newdata){
    matrix <- model.matrix(newdata) # or something like that
    stats::predict(object@model, matrix)
  }
)

现在,您修改predict.Model(以及签名为predict的{​​{1}}的S4方法)以调用model="Model"