使用函数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
函数应保留其所有其他对象的原始行为,包括其他包中的对象。答案 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
列出的合同没有说明任何关于订单的信息(例如,名称和数字差异通常用于子集;是有序名称的数字索引,还是无序名称? ),所以你真的提出了一个新的通用。