2014-03-14 6 views
3

dbGetQueryRMongo의 S4 제네릭입니다. 그것은 R에서이 같은 기능으로S4 제네릭의 선택적 인수

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

로 선언, skiplimit 선택적 인수입니다. 그러나, 나는이 방법으로 그것을 호출 할 때

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

내가 오류 얻을 :

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

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

소스 코드를보고, 나는 일반 대해 정의 된 두 개의 서명이있는 발견

skip을 전달하지 않고 작동하게하려면 다른 서명이 필요합니다.

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

n S4 범용에서 선택적 인수를 만들기 위해서는 2^n 개의 서명을 정의해야하기 때문에 불편 함을 느끼게합니다. S4 generic에서 선택적 인수를 정의하는 더 좋은 방법이 있습니까?

+0

이 오류는'dbGetQuery'의'RSQLite' 버전을 호출 할 때도 발생합니다. 이 오류를 검색 할 때 Google에서이 대답을 반환하기 때문에이 부분을 언급합니다. 이것이 문제인지 아닌지를 결정하려면'find ('dbGetQuery')'를 실행하십시오. 여러 결과가 나타나면 Mongo 함수의 접두어에 * 네임 스페이스 * RMONGo :: dbGetQuery (...)를 붙일 수 있습니다. ' – Matt

답변

2

generic은 dispatch가 실제로 발생하는 인수의 수를 제한 할 수 있습니다 (예 : 'skip'및 'limit'은 결코 숫자가 아니므로 setGeneric에 'signature'인수 사용). 선택적 인수가 '...'다음에 나타나는 것은 드문 일이 아니며 (위치에 따라 매치되는 대신 철자를 써야하지만 명시 적으로는 좋은 아이디어처럼 보입니다. '...' 방법) 자신의 추가 인수를 노출 할 수 있도록 필요한

setGeneric("fancy", 
    function(x, y, ..., z=1, verbose=TRUE) standardGeneric("fancy"), 
    signature=c("x", "y")) 
이 꽤 확신 약속하지만 하나는, '어떤'클래스의 방법을 쓸 수 있습니다

. RMongo은 DBI에서 제네릭을 사용하는 아마 더 나은 것 패키지.