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?
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?
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
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
¿Eso es suponiendo que desea aplicar el operador + a todas las ranuras del objeto? – RockScience
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)) ' –
que es gracias simplemente perfecto (y muy elegantes) – RockScience