2012-01-20 10 views
11

Tengo una clase S4 y me gustaría definir la combinación lineal de estos objetos.suma de objetos S4 en R

¿Es posible despachar * y + funciones en esta clase específica?

Respuesta

12

aquí es un ejemplo:

setClass("yyy", representation(v="numeric")) 

setMethod("+", signature(e1 = "yyy", e2 = "yyy"), function (e1, e2) [email protected] + [email protected]) 
setMethod("+", signature(e1 = "yyy", e2 = "numeric"), function (e1, e2) [email protected] + e2) 

entonces,

> y1 <- new("yyy", v = 1) 
> y2 <- new("yyy", v = 2) 
> 
> y1 + y2 
[1] 3 
> y1 + 3 
[1] 4 
+0

que es gracias simplemente perfecto (y muy elegantes) – RockScience

16

El operador + es parte del grupo Arith genérico (véase ?GroupGenericFunctions) lo que uno puede implementar todas las funciones en el grupo con

setMethod("Arith", "yyy", function(e1, e2) { 
    v = callGeneric([email protected], [email protected]) 
    new("yyy", v = v) 
}) 

y luego con

setClass("yyy", representation(v="numeric")) 
setMethod(show, "yyy", function(object) { 
    cat("class:", class(object), "\n") 
    cat("v:", [email protected], "\n") 
}) 
setMethod("Arith", "yyy", function(e1, e2) { 
    v = callGeneric([email protected], [email protected]) 
    new("yyy", v = v) 
}) 

Uno tendría

> y1 = new("yyy", v=1) 
> y2 = new("yyy", v=2) 
> y1 + y2 
class: yyy 
v: 3 
> y1/y2 
class: yyy 
v: 0.5 
## ...and so on 
+0

¿Eso es suponiendo que desea aplicar el operador + a todas las ranuras del objeto? – RockScience

+1

Está redistribuyendo al operador aritmético la ranura 'v' de los objetos e1 y e2. Si hubiera ranuras v y w, podría escribir para el cuerpo del método 'new (" yyy ", v = callGeneric (e1 @ v, e2 @ v), w = callGeneric (e1 @ w, e2 @ w)) ' –

Cuestiones relacionadas