【问题标题】:sum of S4 objects in RR中S4对象的总和
【发布时间】:2012-01-20 06:48:02
【问题描述】:

我有一个 S4 类,我想定义这些对象的线性组合。

是否可以在这个特定的类上调度 *+ 函数?

【问题讨论】:

    标签: r operator-overloading s4


    【解决方案1】:

    + 运算符是 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)
    })
    

    会有的

    > 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
    

    【讨论】:

    • 这是假设您想将 + 运算符应用于对象的所有插槽?
    • 它正在重新分配给对象 e1 和 e2 的槽 'v' 的算术运算符。如果有插槽 v 和 w,你可以为方法体编写 new("yyy", v = callGeneric(e1@v, e2@v), w = callGeneric(e1@w, e2@w))
    【解决方案2】:

    这是一个例子:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多