取函数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
函数应该为所有其他对象保持其原始行为,包括来自其他包的对象。 最佳答案
泛型可作为
> 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
规定的契约(Contract)没有说明顺序(例如,名称和数字索引通常用于子集;是有序名称的数字索引还是无序名称?),因此您实际上是在提议一个新的泛型。
关于r - 为原始函数的隐式 S4 泛型添加额外参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18445422/