dbGetQuery
是RMongo中的S4泛型。它被声明为
dbGetQuery(rmongo.object, collection, query, skip=0, limit=1000)
对于R中这样的函数,skip
和limit
是可选参数。然而,当我这样调用它
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包中的泛型可能会更好。