【问题标题】:Can I define S4 methods that dispatch on more than one argument from an S3 generic?我可以定义从 S3 泛型中调度多个参数的 S4 方法吗?
【发布时间】: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 方法调度的不仅仅是第一个参数?

【问题讨论】:

    标签: r s4


    【解决方案1】:

    您可以使 S4 泛型在多个参数上分派,但您不能(当前)在命名参数和 ... 上分派。这就是 predict 的问题——唯一的命名参数是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的S4方法,签名为model="Model")调用predict2(model,newdata)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多