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