Я бы хотел определить класс-оболочку, которая будет инкапсулировать фактическую модель, и позволить пользователю вызвать 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 отправлять больше, чем только первый аргумент?