2013-08-09 3 views
1

Я относительно новичок в ООП и нуждаюсь в совете: что является лучшим способом перегрузить генераторы Арифметики в ссылочных классах в R?Перегрузка оператора в эталонных классах R

Например, предположим, что я определяю

bar <- setRefClass("foo", fields=list(a="numeric", b="numeric")) 

Если я пытаюсь очевидную вещь:

> bar$new(a=3,b=1) + bar$new(a=1,b=3) 
Error in bar$new(a = 3, b = 1) + bar$new(a = 1, b = 3) : 
non-numeric argument to binary operator 

Что такое рекомендуемый способ сделать что-то подобное (а + а) + (b + Ь)?

+0

Я не могу на всю жизнь понять, что вы хотели сделать, но посмотрите: 'rab <- bar $ new (a = 3, b = 1); класс (раб); rab $ a будет указывать на пару проблем. Вам нужно будет определить метод '+', который разрывает ваши объекты и связывает их вместе. Если у вас нет необходимости взаимодействовать с языком ООП, я бы рекомендовал избегать «RefClass» и использовать стандартные классы и методы класса «R». –

+0

Я работаю с массивными наборами данных, поэтому использование стандартного R с его псевдо-копировальными методами вызывает головные боли памяти. Справочные классы чрезвычайно полезны для этой проблемы, и я нахожу их чрезвычайно полезными. В сочетании с data.table, я могу реплицировать многие из объектов в sqldf и ff с минимальными усилиями. –

ответ

2

Вы можете воспользоваться тем, что ссылки на классы S4 + среды, и определить метод S4:

bar <- setRefClass("foo", fields = list(a = "numeric", b = "numeric")) 
one <- bar$new(a = 1, b = 1) 
two <- bar$new(a = 2, b = 2) 

# Find the formals for + with getGeneric("+") 
setMethod("+", c("foo", "foo"), function(e1, e2) { 
    bar$new(a = e1$a + e2$a, b = e1$b + e2$b) 
}) 
one + two 

Это так же легко определить набор методов для группы родовом:

setMethod("Ops", c("foo", "foo"), function(e1, e2) { 
    bar$new(a = callGeneric(e1$a, e2$a), b = callGeneric(e1$b, e2$b)) 
}) 
one/two 
+0

Спасибо! Я попробовал вариант этой команды setMethod, но я не сделал это правильно. Может ли этот ответ быть обобщен ко всем арифметическим примитивам? –

+0

Добавлен пример AndrewZachary – hadley

Смежные вопросы