12

S4クラスがあり、これらのオブジェクトの線形結合を定義したいと思います。

この特定のクラスでディスパッチ*して機能することは可能ですか?+

4

2 に答える 2

16

+演算子はArithグループジェネリックの一部であるため(を参照)?GroupGenericFunctions、グループ内のすべての関数を次のように実装できます。

setMethod("Arith", "yyy", function(e1, e2) {
    v = callGeneric(e1@v, e2@v)
    new("yyy", v = v)
})

そして

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

1つは持っているだろう

> 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
于 2012-01-20T11:33:19.343 に答える
13

ここに例があります:

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

setMethod("+", signature(e1 = "yyy", e2 = "yyy"), function (e1, e2) e1@v + e2@v)
setMethod("+", signature(e1 = "yyy", e2 = "numeric"), function (e1, e2) e1@v + e2)

それから、

> y1 <- new("yyy", v = 1)
> y2 <- new("yyy", v = 2)
> 
> y1 + y2
[1] 3
> y1 + 3
[1] 4
于 2012-01-20T07:09:10.207 に答える