rep 真的是泛型吗?
Is rep really a generic?
当我在控制台中键入泛型的函数名称时,我希望看到对 UseMethod
的调用。例如,the documentation for determinant
称其为泛型,当我将其输入控制台时得到以下输出:
> determinant
function (x, logarithm = TRUE, ...)
UseMethod("determinant")
<bytecode: 0x55fb617086b8>
<environment: namespace:base> #
The documentation for rep
提出了类似的声明,但我的控制台没有给出类似的输出:
> rep
function (x, ...) .Primitive("rep")
和.
这给我留下了两种可能性。要么我对 R 的泛型函数理解很差,要么 rep
根本不是泛型。是哪个?
在the code for the interal rep function中调用
DispatchOrEval(call, op, "rep", args, rho, &a, 0, 0)
如果你的函数是一个可见的“对象”,它只会进行通用调度 here。
R 中的矩阵不被视为“对象”,它们是基本类型,因此不会进行分派。
is.object(matrix(1:3))
# [1] FALSE
这是针对频繁调用且需要快速的函数的代码优化。
因此您将无法使用 S3 泛型为矩阵创建自定义 rep
函数。如果你想改变行为(这可能会破坏依赖于现有行为的功能),你必须隐藏基本功能。用不同的名字编写自己的函数来做你想做的事情可能更好。
当我在控制台中键入泛型的函数名称时,我希望看到对 UseMethod
的调用。例如,the documentation for determinant
称其为泛型,当我将其输入控制台时得到以下输出:
> determinant
function (x, logarithm = TRUE, ...)
UseMethod("determinant")
<bytecode: 0x55fb617086b8>
<environment: namespace:base> #
The documentation for rep
提出了类似的声明,但我的控制台没有给出类似的输出:
> rep
function (x, ...) .Primitive("rep")
和
这给我留下了两种可能性。要么我对 R 的泛型函数理解很差,要么 rep
根本不是泛型。是哪个?
在the code for the interal rep function中调用
DispatchOrEval(call, op, "rep", args, rho, &a, 0, 0)
如果你的函数是一个可见的“对象”,它只会进行通用调度 here。
R 中的矩阵不被视为“对象”,它们是基本类型,因此不会进行分派。
is.object(matrix(1:3))
# [1] FALSE
这是针对频繁调用且需要快速的函数的代码优化。
因此您将无法使用 S3 泛型为矩阵创建自定义 rep
函数。如果你想改变行为(这可能会破坏依赖于现有行为的功能),你必须隐藏基本功能。用不同的名字编写自己的函数来做你想做的事情可能更好。