r语言 - S4泛型中的可选参数



dbGetQuery是RMongo中的S4泛型。它被声明为

dbGetQuery(rmongo.object, collection, query, skip=0, limit=1000)

对于R中这样的函数,skiplimit是可选参数。然而,当我这样调用它

dbGetQuery(mongo, 'changesPerTypeEpoch', '{}', limit=10000)

我得到一个错误:

(function (classes, fdef, mtable):
无法找到用于签名"RMongo"、"字符"、"字符"、"缺失"、"数字"的函数"dbGetQuery"的继承方法
查看源代码,我发现为泛型定义了两个签名:
signature(rmongo.object="RMongo", collection="character", query="character", skip='numeric', limit='numeric')
signature(rmongo.object="RMongo", collection="character", query="character", skip='missing', limit='missing')

所以为了使它在不传递skip的情况下工作,它需要有另一个签名:

signature(rmongo.object="RMongo", collection="character", query="character", skip='missing', limit='numeric')

然而,这让我感到不舒服,因为为了使n在S4泛型中成为可选参数,必须定义2^n签名。有没有更好的方法在S4泛型中定义可选参数?

泛型可以限制分派实际发生的参数数量(使用setGeneric的'signature'参数)(例如,'skip'和'limit'永远不会是数字以外的任何东西,因此不应该包含在分派中。可选参数出现在'…(它们需要拼写完整,而不是按位置匹配,但在这里明确一点似乎是个好主意;"…,以允许方法公开它们自己的附加参数)

setGeneric("fancy",
    function(x, y, ..., z=1, verbose=TRUE) standardGeneric("fancy"),
    signature=c("x", "y"))

还可以为类'ANY'编写方法,尽管这是一个相当自信的承诺。对于RMongo来说,使用DBI包中的泛型可能会更好。

最新更新