es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 +.

Tags:  , , ,

Answer

  1. Avatar for 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.

Comments are closed.