我有两个函数,f1(...)
和 f2(...)
。我想将它们分组在单个函数 f(...)
下,并有条件地将 f(...)
的参数传递给 f1
或f2
。如果向 f(...)
传递一个名为 special.param
的参数,那么我将调用 f2(...)
。否则我会调用f1(...)
。我不相信 UseMethod
可以处理这个问题,因为它会检查第一个参数的类,而不是某个参数是否存在。这样做的正确方法是什么?有没有办法检查 ...
中的参数名称?
最佳答案
如果这些是您的函数,并且 p
是您的特殊参数
f1 <- function(..., p) "f1"
f2 <- function(..., p) "f2"
在 S4 中(也许这不是您想要的......)您可以编写一个在特殊参数上分派(dispatch)的泛型
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 有两个以上的替代方案(例如,缺失、数字、逻辑),或者分派(dispatch)超过 1 个参数 f(x, ..., p),这将变得乏味且容易出错。 S4 方法还意味着可用方法是可发现的 (showMethods(f)
),但在包中实现时会带来额外的文档和命名空间负担。
关于r - R 中的方法根据特定参数的存在进行调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990137/