当我在控制台中键入泛型的函数名时,我希望看到对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
函数。如果想改变行为,就必须对基本函数进行阴影处理(这可能会破坏依赖于现有行为的函数)。也许最好自己写一个不同名字的函数来做你想做的事情。