【发布时间】:2021-02-03 09:50:04
【问题描述】:
动机
我正在尝试创建一个通用 R 函数,它不根据主要参数 (n) 的签名,而是根据辅助参数的存在来分派方法。
我不确定这在 S3 中是否可行,但我知道如何在 S4 中执行此操作(尽管您可能会注意到这种方式很草率)。不知道 R5 或 S6。
MRE
setGeneric(
name = "genfunk",
def = function(n, a, b, c, d) standardGeneric("genfunk"),
signature = c("a", "b", "c", "d")
)
setMethod(
f = "genfunk",
signature = list(
a = "numeric",
b = "numeric",
c = "missing",
d = "missing"
),
definition = function(n, a, b) n + a + b
)
setMethod(
f = "genfunk",
signature = list(
a = "missing",
b = "missing",
c = "numeric",
d = "numeric"
),
definition = function(n, c, d) n * c * d
)
这使我可以调用函数并获得以下内容:
r$> genfunk(10, a=1, b=2)
[1] 13
r$> genfunk(10, c=3, d=2)
[1] 60
问题
问题是混合调用会给用户带来“废话”:
r$> genfunk(10, a=1, c=2)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘genfunk’ for signature ‘"numeric", "missing", "numeric", "missing"’
问题
- 是否可以创建“异常”签名来处理所有这些不正确的参数不匹配?
- 是否可以重命名有效签名以便在文档中正确标记它们?在我的真实案例中,
genfunk的文档包含以下内容:
## S4 method for signature
## 'numeric,numeric,missing,missing'
genfunk(n, a, b)
## S4 method for signature
## 'missing,missing,numeric,numeric'
genfunk(n, c, d)
这对用户来说毫无意义,除非他们查看泛型的代码。我的实际代码中的情况更糟,因为签名列表目前包含来自十几个不同方法(并且还在计数)的近两打参数。
我认为诀窍应该在文档中的某个地方,但我觉得我已经没有东西可以尝试了。目前,泛型被记录为:
#' @title Yes, title!
#' @param n Enn
#' @export
每种方法都记录为:
#' @title AB funk
#' @param a Ehi!
#' @param b Bee
#' @rdname genfunk
【问题讨论】:
-
所以,简而言之,您想为每个参数组合提供方法吗?
-
@tjebo,差不多。我想为一些(互斥的)参数组合提供方法,并且可能为其余的参数组合提供一个保护伞(只是为了向用户提供一些关于如何使用泛型的有用反馈)。
-
您查看过
dotsMethods的帮助页面吗?您的函数可以使用...作为参数来代替命名参数吗? -
@JDL,感谢您指出这一点,我不知道有一个文档页面。如果我取得进展,我会试一试并回到这里。