Optional arguments in S4 generics

大兔子大兔子 提交于 2019-12-06 07:27:59

问题


dbGetQuery is an S4 generic in RMongo. It is declared as

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

With a function like this in R, skip and limit are optional arguments. However, when I call it in this way

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

I get an error:

Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘dbGetQuery’ for signature ‘"RMongo", "character", "character", "missing", "numeric"’

Looking at the source code, I found there are two signatures defined for the generic:

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

So in order to make it work without passing skip, it needs to have another signature:

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

However, that makes me feel uncomfortable, because in order to make n optional arguments in a S4 generic, one has to define 2^n signatures. Is there any better way to define optional arguments in S4 generic?


回答1:


A generic can limit the number of arguments on which dispatch actually occurs (using the 'signature' argument to setGeneric) (e.g., 'skip' and 'limit' will never be anything other than a numeric, so should not be included in dispatch. It's not unusual for optional arguments to appear after '...' (they need to be spelled in full, instead of being matched by position, but being explicit seems like a good idea here; '...' are needed to allow methods to expose their own additional arguments)

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

One can also write methods for class 'ANY', although that's a pretty confident promise. Probably it would be better for RMongo to use the generics from the DBI package.



来源:https://stackoverflow.com/questions/22395772/optional-arguments-in-s4-generics

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!