3

I am trying to modify the contents of an object defined by a self-written class with a function that takes two objects of this class and adds the contents.

setClass("test",representation(val="numeric"),prototype(val=1))

I know that R not really works with "call by reference" but can mimic that behaviour with a method like this one:

setGeneric("value<-", function(test,value) standardGeneric("value<-"))
setReplaceMethod("value",signature = c("test","numeric"),
  definition=function(test,value) {
    test@val <- value
    test
  })
foo = new("test") #foo@val is 1 per prototype
value(foo)<-2 #foo@val is now set to 2

Until here, anything I did and got as result is consitent with my research here on stackexchange,
Call by reference in R (using function to modify an object)
and with this code from a lecture (commented and written in German)

What I wish to achieve now is a similar result with the following method:

setGeneric("add<-", function(testA,testB) standardGeneric("add<-"))
setReplaceMethod("add",signature = c("test","test"),
  definition=function(testA,testB) {
    testA@val <- testA@val + testB@val
    testA
  })
bar = new("test")
add(foo)<-bar #should add the value slot of both objects and save the result to foo

Instead I get the following error:
Error in `add<-`(`*tmp*`, value = <S4 object of class "test">) : 
  unused argument (value = <S4 object of class "test">)

The function call works with:

"add<-"(foo,bar)

But this does not save the value into foo. Using

foo <- "add<-"(foo,bar)
#or using
setMethod("add",signature = c("test","test"), definition= #as above... )
foo <- add(foo,bar)

works but this is inconsistent with the modifying method value(foo)<-2
I have the feeling that I am missing something simple here. Any help is very much appreciated!

Community
  • 1
  • 1
J. Beck
  • 33
  • 1
  • 4

1 Answers1

0

I do not remember why, but for <- functions, the last argument must be named 'value'. So in your case:

setGeneric("add<-", function(testA,value) standardGeneric("add<-"))
setReplaceMethod("add",signature = c("test","test"),
  definition=function(testA,value) {
    testA@val <- testA@val + value@val
    testA
  })
bar = new("test")
add(foo)<-bar

You may also use a Reference class ig you want to avoid the traditional arguments as values thing.

Karl Forner
  • 4,175
  • 25
  • 32