S4 类 - 使用可变数量的参数重载方法

S4 classes - overload a method with a variable number of arguments

我想在我的 S4 泛型 myMethod 中有可变数量的参数,这样它们都是有效的:

myMethod(100)
myMethod(100, 200)

这是我尝试定义的:

setGeneric(
    "myMethod", 
    function(x) {

        standardGeneric("myMethod")
    })

setMethod(
    "myMethod", 
    signature = c("numeric"), 
    definition = function(x) {

        print("MyMethod on numeric")
    })

setMethod(
    "myMethod", 
    signature = c("numeric", "numeric"), 
    definition = function(x, y) {

        print("MyMethod on numeric, numeric")
    })

然而,这给出了错误:

Error in matchSignature(signature, fdef) : more elements in the method signature (2) than in the generic signature (1) for function ‘myMethod’

您的泛型应该支持 2 个参数。

setGeneric(
  "myMethod", 
  function(x, y) {
    standardGeneric("myMethod")
  })

此外,您的第二个方法中的函数实际上应该支持两个参数:

setMethod(
  "myMethod", 
  signature = c("numeric", "numeric"), 
  definition = function(x, y) {
    print("MyMethod on numeric, numeric")
  })

更一般地说,如果您想指定任意多个参数,您应该查看省略号参数 ...

值得澄清的是您是否要 dispatch(select 一种方法)超过一个参数(在这种情况下,包括 [=13 中的所有参数名称) =] setGeneric())

setGeneric("fun", function(x, y) standardGeneric("fun"),
           signature=c("x", "y"))

setMethod("fun", c(x="numeric", y="numeric"), function(x, y) {
    "fun,numeric,numeric-method"
})

与基于第一个的分派(仅包括 signature= 中的第一个参数)和要求所有方法都有额外的参数(在通用函数中命名参数)

setGeneric("fun", function(x, y) standardGeneric("fun"),
           signature="x")

setMethod("fun", c(x="numeric"), function(x, y) {
    "fun,numeric-method"
})

或仅部分方法(在泛型中使用...,并在方法中命名参数)。

setGeneric("fun", function(x, ...) standardGeneric("fun"),
           signature="x")

setMethod("fun", c(x="numeric"), function(x, y) {
    "fun,numeric-method"
})