mam klasy S4 i am zdefiniować liniowej kombinacji tych przedmiotów.suma obiektów S4 R
Czy można wysłać funkcje *
i +
na tej właśnie klasie?
mam klasy S4 i am zdefiniować liniowej kombinacji tych przedmiotów.suma obiektów S4 R
Czy można wysłać funkcje *
i +
na tej właśnie klasie?
Oto przykład:
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)
Następnie
> y1 <- new("yyy", v = 1)
> y2 <- new("yyy", v = 2)
>
> y1 + y2
[1] 3
> y1 + 3
[1] 4
Operator +
jest częścią grupy Arith rodzajowymi (patrz ?GroupGenericFunctions
) tak można realizować wszystkie funkcje w grupie z
setMethod("Arith", "yyy", function(e1, e2) {
v = callGeneric([email protected], [email protected])
new("yyy", v = v)
})
, a następnie z
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)
})
Jedna miałaby
> 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
Czy to zakładając, że chcesz zastosować operator + do wszystkich szczelin obiektu? – RockScience
Jest to ponowna wysyłka do operatora arytmetycznego dla gniazda "v" obiektów e1 i e2. Gdyby nie było szczelin V i W, można napisać o ciało metody 'nowy ("yyy", v = callGeneric (e1 @ v e2 @ v), w = callGeneric (e1 @ W, e2 @ w)) ' –
to po prostu doskonałe (i bardzo eleganckie) dzięki – RockScience