7

以函数为例names:这是 R 中的原始函数。对于原始函数,会创建隐式 S4 泛型,因此可以为该函数构造 S4 方法。

采用如下定义的 S4 类:

setClass("aClass",
         representation=list(
           values = "character",
           id = "numeric"
           ),
         prototype=list(
           values = character(0),
           id = numeric(0)),
         validity=function(object){
           length(object@values)==length(object@id)
         }
        )

现在我想创建一个函数来提取已排序或未排序的名称。我想使用该函数来做到这一点,names以避免必须创建一个新函数getNames()或其他任何东西,因为这不太直观。

下面给出了需要做什么的想法:

setMethod("names",signature="aClass",
   function(x,ordered=TRUE){
      if(ordered)
        x@values[x@id]
      else
        x@values
   }

这不起作用,因为names它是原始函数,并且ordered不是隐式泛型的参数。

如何在以下条件下进行这项工作:

  • names函数应保持所有其他对象的原始行为,包括来自其他包的对象。
  • 代码应该可以在包中使用
  • 该代码应该可以被例如 Bioconductor 设定的高标准所接受。
4

1 回答 1

9

泛型可用作

> getGeneric("names")
standardGeneric for "names" defined from package "base"

function (x) 
standardGeneric("names", .Primitive("names"))
<environment: 0x459c9c0>
Methods may be defined for arguments: x
Use  showMethods("names")  for currently available ones.

所以从签名中你可以看到简短的回答是你不能添加参数。您绝对不想创建自己的函数names。黑客会使用包全局变量getOption("pkg_names_ordered"),但我自己不会参与该解决方案。

在某些方面,合同规定的names内容没有说明任何关于顺序的内容(例如,名称和数字索引通常用于子集;是有序名称的数字索引还是无序名称?),所以你真的在提议无论如何,一个新的通用。

于 2013-08-26T13:43:17.070 回答