2012-01-20 16 views

Odpowiedz

12

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 
+0

to po prostu doskonałe (i bardzo eleganckie) dzięki – RockScience

16

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 
+0

Czy to zakładając, że chcesz zastosować operator + do wszystkich szczelin obiektu? – RockScience

+1

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)) ' –

Powiązane problemy