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

时间:2015-04-17 07:45:22

标签: r generics overloading s4 arity

我想在我的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")
    })

但是,这会产生错误:

  

matchSignature(签名,fdef)出错:     方法签名(2)中的元素多于函数“myMethod”

的通用签名(1)中的元素

2 个答案:

答案 0 :(得分:2)

值得澄清的是,您是否要在多个参数上调度(选择方法)(在这种情况下,包括signature= 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"
})

答案 1 :(得分:1)

您的通用应支持2个参数。

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

第二种方法中的函数实际上应该支持两个参数:

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

更一般地说,如果你想指定任意多个参数,你应该看一下elipsis参数...