r语言 - rep真的是通用的吗?



当我在控制台中键入泛型的函数名时,我希望看到对UseMethod的调用。例如,determinant的文档将其称为泛型,当我将其输入到控制台时,我得到以下输出:

> determinant
function (x, logarithm = TRUE, ...) 
UseMethod("determinant")
<bytecode: 0x55fb617086b8>
<environment: namespace:base> #

rep的文档做了类似的声明,但我的控制台没有给出类似的输出:

> rep
function (x, ...)  .Primitive("rep")

我试图扩展rep,但没有成功。

这给我留下了两种可能性。要么我对R的泛型函数理解不好,要么rep根本就不是泛型。是哪一个?

在内部rep函数的代码中,它调用

DispatchOrEval(call, op, "rep", args, rho, &a, 0, 0)

,它只会在你的函数是"一个对象"的情况下进行泛型调度。

R中的矩阵不被认为是"对象",它们是基本类型,因此不会发生分派。

is.object(matrix(1:3))
# [1] FALSE

这是一个代码优化的函数被频繁调用,需要快速。

因此,您将无法使用S3泛型为矩阵创建自定义rep函数。如果想改变行为,就必须对基本函数进行阴影处理(这可能会破坏依赖于现有行为的函数)。也许最好自己写一个不同名字的函数来做你想做的事情。

最新更新