1

我想在我的 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(signature, fdef) 中的错误:方法签名 (2) 中的元素多于函数“myMethod”的通用签名 (1) 中的元素</p>

4

2 回答 2

3

有必要澄清您是否要在多个参数上分派signature=(选择一种方法)(在这种情况下,包括of中的所有参数名称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"
})
于 2015-04-17T11:18:09.177 回答
1

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

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

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

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

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

于 2015-04-17T08:19:06.347 回答