2014-03-14 29 views
3

dbGetQueryRMongo中的S4通用名。它被聲明爲S4通用中的可選參數

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

隨着R中這樣的功能,skiplimit可選參數。然而,當我把它用這種方式

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

我得到一個錯誤:

Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘dbGetQuery’ for signature ‘"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通用中製作可選參數,必須定義2^n個簽名。有沒有更好的方法來定義S4泛型中的可選參數?

+0

當您調用'dbGetQuery'的'RSQLite'版本時,也會發生此錯誤。我提到這是因爲google在搜索這個錯誤時返回這個答案。要確定這是否是你的問題,運行'find('dbGetQuery')',如果你看到多個結果,你可以通過在名稱空間前面加上前綴來指定Mongo函數,* ie *'RMongo :: dbGetQuery(...) ' – Matt

回答

2

泛型可以限制實際發生調度的參數數量(使用setGeneric的'signature'參數)(例如,'skip'和'limit'永遠不會是數字以外的任何東西,所以不應該是包括在發送中,可選參數在'...'之後出現並不罕見(它們需要拼寫完整,而不是與位置匹配,但在這裏顯式看起來像是一個好主意;'...'是需要允許的方法來暴露自己的附加參數)

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

你也可以寫爲類「ANY」的方法,雖然這是一個非常自信的承諾,也許這將是更好地爲RMongo從DBI使用泛型包