r - R 中的方法根据特定参数的存在进行调度

标签 r

我有两个函数,f1(...)f2(...)。我想将它们分组在单个函数 f(...) 下,并有条件地将 f(...) 的参数传递给 f1f2。如果向 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/

相关文章:

r - 求 R 中每 1000000 个计数的列的平均值

r - 在 R 中如何对 R6 对象数组进行排序

r - 如何用相对于每个方面的百分比绘制多面直方图(不是条形图)?

r - 为什么从因子变量的文档中强制这个因子变量返回几个 NA?

r - 加速 R 中的 lmer 函数

正则表达式 - 在 : right boundary not escaped 之间抓取

r - R SplitRatio 参数中的 Sample.Split 必须是 i [0,1]

r - 仅选择与特定字符串匹配的行

r - 将关键图例添加到 R 中的多直方图

css - 将 R Shiny showNotification 移动到屏幕中央