我想在我的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)中的元素
答案 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参数...
。