【发布时间】:2019-06-12 10:44:34
【问题描述】:
我想定义一个封装一个实际模型的包装类,并让用户使用新数据框或模型矩阵调用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 方法调度的不仅仅是第一个参数?
【问题讨论】: