我在R中有一个通用的方法:
setGeneric(
"doWork",
function(x) {
standardGeneric("doWork")
})
setMethod(
"doWork",
signature = c("character"),
definition = function(x) {
x
})
如何在定义中添加...(点)参数?
答案 0 :(得分:4)
也许我错过了什么,但你可以做到:
setGeneric("doWork", function(x, ...) standardGeneric("doWork"))
setMethod("doWork", signature = c("character"),
function(x, ...) do.call(paste, list(x, ..., collapse=" "))
)
然后:
> doWork("hello", "world", letters[1:5])
[1] "hello world a hello world b hello world c hello world d hello world e"
> doWork(1:3, "world", letters[1:5])
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘doWork’ for signature ‘"integer"’
如果您在某些情况下需要,您甚至可以在...
上发送。来自?dotsMethods
:
从R的2.8.0版开始,可以调度(选择和调用)与特殊参数“...”对应的S4方法。目前,“...”不能与其他形式参数混合:通用函数的签名只是“...”,或者它不包含“......”。 (此限制可能会在将来的版本中解除。)
因此,如果我们想要一个仅在所有参数都是“character”的情况下运行的函数:
setGeneric("doWork2", function(...) standardGeneric("doWork2"))
setMethod("doWork2", signature = c("character"),
definition = function(...) do.call(paste, list(..., collapse=" "))
)
doWork2("a", "b", "c") # [1] "a b c"
doWork2("a", 1, 2) # Error