R:何时使用setGeneric或在命名空间中导出s4方法

Jav*_*bie 5 oop r bioconductor s4

我正在写一个小R包,其想法是将来提交给Bioconductor,这就是我决定试用s4课程的原因.不幸的是我在理解何时应该在我的包中使用setGeneric时遇到了问题,并且该setGeneric方法的文档对我来说或多或少是不可理解的.

具体例子:

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

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

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

问题2:我该怎么做才能as.list上班?在命名空间中导出方法?用setGeneric

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

Mar*_*gan 4

在仅加载基础包和方法的 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
Run Code Online (Sandbox Code Playgroud)

加载 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.
Run Code Online (Sandbox Code Playgroud)

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

import(methods)
import(BiocGenerics)

exportMethods("[", "as.list")
Run Code Online (Sandbox Code Playgroud)

并在您的描述文件中添加以下内容

Imports: methods, BiocGenerics
Run Code Online (Sandbox Code Playgroud)

如果您不从 BiocGenerics 导入仿制药,那么您setMethod("as.list", ...)将创建自己的仿制药。在 Bioconductor 的背景下,用户不得不说YourPkg::as.list(YourObject)或者BiocGenerics::as.list(NotYourObject)这显然不是一个好主意。

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