【问题标题】:Optional arguments in S4 genericsS4 泛型中的可选参数
【发布时间】:2014-03-14 03:52:37
【问题描述】:

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

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

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

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

我收到一个错误:

(函数(类、fdef、mtable)中的错误:
无法为签名“RMongo”、“character”、“character”、“missing”、“numeric”'找到函数“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')

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

【问题讨论】:

  • 当您调用RSQLite 版本的dbGetQuery 时也会出现此错误。我提到这一点是因为谷歌在搜索此错误时会返回此答案。要确定这是否是您的问题,请运行find('dbGetQuery'),如果您看到多个结果,您可以通过为其命名空间添加前缀来指定 Mongo 函数, RMongo::dbGetQuery(...)

标签: r generics s4


【解决方案1】:

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

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

也可以为“ANY”类编写方法,尽管这是一个非常有信心的承诺。 RMongo 使用 DBI 包中的泛型可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-03-24
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多