¿Cómo reutilizar operadores infijos como %*% y %x% en un paquete para el despacho de métodos S3?
Tengo una pregunta sobre el uso del operador infijo R, que incluye %*%
y otros similares.
Para sobrecargar el operador +
para una clase personalizada, puedo usar:
' @export
+.custom = function(x, y) ...
Sin embargo, no se pueden aplicar métodos similares a %*%
u otros operadores que comienzan y terminan con %
. Busqué en muchos sitios y no encontré nada útil para resolver esto.
¿Alguna sugerencia?
A continuación se presenta un ejemplo.
x = 1:5
y = 6:10
class(x) = "custom"
class(y) = "custom"
x + y
[1] 7 9 11 13 15
attr(,"class")
[1] "custom"
+.custom = function(x, y) return(as.numeric(x) + as.numeric(y) + 1)
%*%.custom = function(x, y) return(as.numeric(x) + as.numeric(y) + 1)
x %*% y
[,1]
[1,] 130
%*%.custom(x, y)
[1] 8 10 12 14 16
Parece que %*%
no admite la asignación de métodos S3.
Puedo resolver esto sobrescribiendo %*%
en mi paquete con una implementación de envío manual, como:
%*% = function(x, y)
if (any(class(x) %in% "custom"))
return(as.numeric(x) + as.numeric(y) + 1)
else
base::`%*%`(x, y)
x %*% y
[1] 8 10 12 14 16
as.numeric(x) %*% as.numeric(y)
[,1]
[1,] 130
Sin embargo, prefiero la primera forma, como +
.
davy.ai
Parece que para operadores infix como
%*%
, no se puede utilizar tan fácilmente la selección de S3method dispatch como se puede utilizar para otros operadores como+
. Una solución a este problema es sobrescribir la función%*%
en el paquete con código enviado manualmente. Sin embargo, esta solución puede no ser ideal. Una solución alternativa sería crear un nuevo operador infix que funcione de manera similar a%*%
y se pueda sobrecargar con la selección de S3method dispatch.