S4泛型中的可选参数

时间:2014-03-14 03:52:37

标签: r generics s4

dbGetQueryRMongo中的S4泛型。它被声明为

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

在R中使用这样的函数,skiplimit是可选参数。但是,当我以这种方式称呼它时

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

我收到错误:

  

(函数(classes,fdef,mtable)中的错误:
    无法找到函数'dbGetQuery'的继承方法,用于签名'“RMongo”,“character”,“character”,“missing”,“numeric”'

查看源代码,我发现为通用定义了两个签名:

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')

但是,这让我感到不舒服,因为为了在S4泛型中创建n个可选参数,必须定义2 ^ n个签名。有没有更好的方法在S4 generic中定义可选参数?

1 个答案:

答案 0 :(得分:2)

泛型可以限制实际发生调度的参数数量(使用setGeneric的'signature'参数)(例如,'skip'和'limit'永远不会是数字以外的任何东西,所以不应该包括在“发送”之后出现可选参数并不罕见(它们需要拼写完整,而不是按位置匹配,但在这里显式似乎是个好主意;'...'是必需的允许方法公开自己的附加参数)

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

也可以为“任何”类编写方法,尽管这是一个非常自信的承诺。对于RMongo来说,使用DBI包中的泛型可能会更好。