1

我创建了一个自定义 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 方法不兼容,这使得它相当无用。

4

0 回答 0