我创建了一个自定义 S4 类,想法是它代表一个始终排序的向量,所以我不想sort()
对它做任何事情。所以我sort()
为我的班级定义了一个存根版本:
MyClass <- methods::setClass("MyClass", slots=list(x="numeric"))
setMethod("sort", signature(x="MyClass"), function(x, ...){}) # Do nothing
然后,我想计算我班级的分位数。R 的quantile()
函数内部调用sort()
. 但是,sort()
used 内部quantile()
不知道我的 S4 方法,因为它使用UseMethod()
(S3 调度程序)而不是 standardGeneric()
S4 调度程序进行调度。如下所示:
options(error=traceback)
instance = MyClass()
quantile(instance, 0.5)
这将返回一个调用堆栈,如下所示:
5: order(x, na.last = na.last, decreasing = decreasing)
4: sort.default(x, partial = unique(c(lo, hi)))
3: sort(x, partial = unique(c(lo, hi)))
2: quantile.default(instance, 0.5)
1: quantile(instance, 0.5)
由于sort.default
被调用,很明显我的自定义sort
实现没有被使用。
有没有一种简单的方法可以让 R 在这里使用我的 S4 方法?我意识到我也可以定义sort.MyClass
(S3 方式),但如果我这样做,那么拥有 S4 方法有什么意义呢?似乎 S4 与核心 R 方法不兼容,这使得它相当无用。