Могу ли я определить методы S4, которые отправляют более одного аргумента из универсального S3? - PullRequest
0 голосов
/ 12 июня 2019

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

Вы можете сделать отправку универсальных S4 по нескольким аргументам, но вы не можете (в настоящее время) отправлять по именованному аргументу и ....Это проблема с предикатом - единственным именованным аргументом является object.

. Тем не менее, вы все равно можете достичь желаемого, определив свой собственный общий «на один уровень вниз» по линиям

* 1006.*

Теперь вы модифицируете predict.Model (и метод S4 для predict с подписью model="Model") для вызова predict2(model,newdata).

...