基于特定参数的存在在R中调度方法

时间:2014-04-10 13:55:52

标签: r

我有两个功能f1(...)f2(...)。我想将它们分组到一个函数f(...)下,并有条件地将f(...)的参数传递给f1f2。如果f(...)传递了名为special.param的参数,那么我将调用f2(...)。否则我会打电话给f1(...)。我不相信UseMethod可以处理这个问题,因为它会检查第一个参数的类而不是某个参数的存在。这样做的正确方法是什么?有没有办法检查...中的参数名称?

1 个答案:

答案 0 :(得分:3)

如果这些是您的功能,p是您的特殊参数

f1 <- function(..., p) "f1"
f2 <- function(..., p) "f2"

在S4中(也许这不是你正在寻找的......)你可以写一个派生于特殊参数的通用

setGeneric("f", function(..., p) standardGeneric("f"),
    signature="p", useAsDefault=f1)

并实现一个在缺少参数时调用的方法

setMethod("f", "missing", f2)

具有相同结果的更对称的实现将是

setGeneric("f", function(..., p) standardGeneric("f"), signature="p")
setMethod("f", "ANY", f1)
setMethod("f", "missing", f2)

> f(p=1)
[1] "f1"
> f()
[1] "f2"

更简单的基础R替代方案(由评论和删除的答案暗示)是

f <- function(..., p) {
    if (missing(p))
        f2(...)
    else
        f1(..., p=p)
}

如果p有两个以上的替代方案(例如,缺少与数字对比逻辑)或者如果调度超过1个参数f(x,...,p),则这将变得繁琐且容易出错。 S4方法还意味着可用的方法是可发现的(showMethods(f)),但在包中实现时会带来额外的文档和NAMESPACE负担。