Сумма объектов S4 в R У меня есть класс S4, и я бы хотел определить линейную комбинацию этих объектов. Можно ли отправлять функции * и + в этом конкретном классе? Ответ 1 вот пример: 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) то > y1 <- new("yyy", v = 1) > y2 <- new("yyy", v = 2) > > y1 + y2 [1] 3 > y1 + 3 [1] 4 Ответ 2 Оператор + является частью общей группы Arith (см. ?GroupGenericFunctions), поэтому можно реализовать все функции в группе с помощью setMethod("Arith", "yyy", function(e1, e2) { v = callGeneric([email protected], [email protected]) new("yyy", v = v) }) а затем с 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) }) Можно было бы > 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
Ответ 1 вот пример: 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) то > y1 <- new("yyy", v = 1) > y2 <- new("yyy", v = 2) > > y1 + y2 [1] 3 > y1 + 3 [1] 4
Ответ 2 Оператор + является частью общей группы Arith (см. ?GroupGenericFunctions), поэтому можно реализовать все функции в группе с помощью setMethod("Arith", "yyy", function(e1, e2) { v = callGeneric([email protected], [email protected]) new("yyy", v = v) }) а затем с 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) }) Можно было бы > 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