【问题标题】:R: when to use setGeneric or export a s4 method in the namespaceR:何时使用 setGeneric 或在命名空间中导出 s4 方法
【发布时间】:2015-02-03 14:22:22
【问题描述】:

我正在编写一个小型 R 包,并打算将来将其提交给 Bioconductor,这就是我决定尝试 s4 类的原因。不幸的是,我在理解什么时候应该在我的包中使用 setGeneric 时遇到了问题,setGeneric 方法的文档对我来说或多或少难以理解。

具体例子:

  1. 我创建了一个名为 Foo 的 s4 类
  2. 我使用setMethod("[","Foo", ...)[<- 运算符定义了一个方法
  3. 我使用setMethod("as.list", "Foo",...)as.list 函数定义了一个方法
  4. 我避免使用 setGenerics 并在命名空间中导出我的方法,因为我在某处读到已经定义的泛型函数不需要它

现在的问题是 [ 访问器方法就像一个魅力,但 as.list 不起作用。更令人困惑的是,当我通过在 R 终端输入 library(BiocGenerics) 导入库 BiocGenerics 时,as.list 开始工作。

问题 1:我如何确定 [ 将始终有效?而且这不只是因为我导入了一些库而巧合吗?

问题 2:我应该怎么做才能使as.list 工作?导出命名空间中的方法?使用setGeneric?

问题3:我认为as.list开始工作是因为在BiocGenerics包中使用了setGeneric("as.list"...),但似乎并非如此,从这里阅读:http://www.bioconductor.org/packages/release/bioc/manuals/BiocGenerics/man/BiocGenerics.pdf
那么为什么as.list 开始工作了呢?它是在哪里定义的?

【问题讨论】:

    标签: r oop s4 bioconductor


    【解决方案1】:

    在仅加载了基本包和方法的 R 会话中,您可以看到“[”的泛型已定义,而“as.list”的泛型未定义

    > getGeneric("[")
    standardGeneric for "[" defined from package "base"
    
    function (x, i, j, ..., drop = TRUE) 
    standardGeneric("[", .Primitive("["))
    <bytecode: 0x28f7990>
    <environment: 0x28ebef0>
    Methods may be defined for arguments: x, i, j, drop
    Use  showMethods("[")  for currently available ones.
    > getGeneric("as.list")
    NULL
    

    加载 BiocGenerics 确实为 as.list 定义了泛型

    > suppressPackageStartupMessages(library(BiocGenerics))
    > getGeneric("as.list")
    standardGeneric for "as.list" defined from package "base"
    
    function (x, ...) 
    standardGeneric("as.list")
    <environment: 0x5969210>
    Methods may be defined for arguments: x
    Use  showMethods("as.list")  for currently available ones.
    

    如果您的包装用于 Bioconductor,请重新使用 BiocGenerics 的仿制药。在您的 NAMESPACE 文件中执行以下操作

    import(methods)
    import(BiocGenerics)
    
    exportMethods("[", "as.list")
    

    并在您的说明文件中包含以下内容

    Imports: methods, BiocGenerics
    

    如果您不从 BiocGenerics 导入泛型,那么您的 setMethod("as.list", ...) 将创建它自己的泛型。在 Bioconductor 的上下文中,用户必须说 YourPkg::as.list(YourObject)BiocGenerics::as.list(NotYourObject),这显然不是一个好主意。

    您需要import(methods),因为在您的交互式试验中,您依赖于位于 search() 路径上的方法包。但是 (a) R CMD BATCH 在没有附加方法包的情况下运行,并且 (b) 最好的做法是依赖显式 in 您的名称空间中的符号,而不仅仅是搜索路径(因此受到其他包或具有任意行为的用户函数的屏蔽。这与方法包一样适用。

    【讨论】:

    • 非常感谢。但是如果“as.list”仅通过使用“setMethods”并导出它就可以工作,我为什么要导入“BiocGenerics”?为什么要导入“方法”?
    • 可能想要:Depends: BiocGenericsDESCRIPTION 文件中,以便用户看到泛型。
    • 我花了更多的步骤让它真正起作用,我已经分享了它作为另一个 SO 问题的答案:stackoverflow.com/questions/13137912/…
    猜你喜欢
    • 2018-08-25
    • 2013-09-01
    • 2021-02-26
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多