2015-11-05 3 views
6

Я экспериментирую с классами S4 в R, и я пытался определить оператор (+) для моих объектов, то есть перегрузить оператор плюс. Мне удалось перегрузить двоичный файл +, но я не могу понять, как перегрузить унарный плюс. Вот минимальный рабочий (унарный оператор не работает) пример того, что я пытаюсь достичь:Унарный плюс для класса S4 в R

setClass("HWtest", 
     representation(expr = "character"), 
     prototype = list(expr = NA_character_) 
) 

H <- new("HWtest", expr="Hello") 
W <- new("HWtest", expr="World") 

setMethod("+", signature(e1="HWtest", e2="HWtest"), 
      function(e1,e2){ 
      new("HWtest", 
       expr = paste([email protected]," + ",[email protected])) 
      } 
) 

Теперь я могу использовать оператор + и работает гладко:

H+W 
An object of class "HWtest" 
Slot "expr": 
[1] "Hello + World" 

Теперь унарный плюс, конечно, не работает, так что должен быть перегружен

+H 
Error in +H : invalid argument to unary operator 

так что я попытался перегружать его следующим образом:

setMethod("+", signature(e="HWtest"), 
      function(e){ 
      new("HWtest", 
       expr = paste("+ ",[email protected])) 
      } 
) 

Но это порождает ошибку:

Error in match.call(fun, fcall) : 
    argument 1 matches multiple formal arguments 

Можно ли перегружать унарный плюс? Если да, то как мне это сделать для этого минимального примера?

ответ

6

Попробуйте добавить это (в дополнение к бинарной перегрузки):

setMethod("+", signature(e1 = "HWtest", e2 = "missing"), 
      function(e1){ 
      new("HWtest", 
       expr = paste("+ ", [email protected])) 
      } 
) 

R> +H 
An object of class "HWtest" 
Slot "expr": 
[1] "+ Hello" 

R> H + W 
An object of class "HWtest" 
Slot "expr": 
[1] "Hello + World" 

Приводя файл справки ?groupGeneric,

[...] when a unary operator is encountered the Ops method is called with one argument and e2 is missing.

И как Франк указывает ,Файл справкисодержит некоторую полезную информацию об использовании missing в качестве подписи к способу работы (выделено мной):

Two additional special class names can appear: "ANY", meaning that this argument can have any class at all; and "missing", meaning that this argument must not appear in the call in order to match this signature.

+0

Отлично! Спасибо, что решает мою проблему! – Gumeo

+2

Я думаю, что '? SetMethod' также полезен, где объясняется, как указывать, что отсутствует аргумент arg, например' 'missing", что означает, что этот аргумент не должен появляться в вызове, чтобы соответствовать этой сигнатуре. ' – Frank

+0

Ok this разъясняет это для меня! Большое спасибо парням :) – Gumeo

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