为基本函数的隐式S4泛型添加额外参数

时间:2013-08-26 13:32:12

标签: r generics primitive names s4

使用函数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设定的高标准接受。

1 个答案:

答案 0 :(得分:6)

通用名称为

> 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列出的合同没有说明任何关于订单的信息(例如,名称和数字差异通常用于子集;是有序名称的数字索引,还是无序名称? ),所以你真的提出了一个新的通用。