我想定义一个包装类,该类将封装实际模型,并让用户使用新数据框或模型矩阵调用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方法不仅仅用于此目的。第一个论点?
答案 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"
。