S4: Use class attributes as default input values ​​for class methods

I am new to S4 OO in R. I am thinking of using class attributes as the default input to common methods, but I got an error message saying that argument "xxx" is missing, with no default.

Basically, I have a list of functions (e.g. class methods) that work with the same set of class attributes. I want to use these class attributes as the default input values ​​for the list of functions, but the way I implemented (I used definition = function(theObject, input = theObject@attribute1), see the code example below) is throwing an error ... Why doesn't this work?

Thank you very much in advance!

class1 = setClass("class1", 
                  slots = c(attribute1 = "numeric"), 
                  prototype = list(
                    attribute1 = NULL
                  ))

setGeneric(name = "method1", 
           def = function(theObject, input){
             standardGeneric("method1")
           })

setMethod(f = "method1", 
          signature = "class1", 
          definition = function(theObject, input = theObject@attribute1){
            theObject@attribute1 = input + 1
            return (theObject)
          })


x = class1() # instantiate an object from class1
x@attribute1 = 1 # set attribute value
method1(x, input = 2) # This works fine if I use "input = 2" explicitly

# This throws the following error "Error in method1(x) : argument "input" is missing, with no default"
# Even though in setMethod part I did specify the default value of input
method1(x)
+4
source share
1 answer

, , , setMethod, . :.

class1 = setClass("class1", 
                  slots = c(attribute1 = "numeric"), 
                  prototype = list(
                    attribute1 = NULL
                  ))

setGeneric(name = "method1", 
           def = function(theObject, input=NA){ #Setting any input here enables defaults for methods
             standardGeneric("method1")
           })

setMethod(f = "method1", 
          signature = "class1", 
          definition = function(theObject, input=1){
            theObject@attribute1 = input + 1
            return (theObject)
          })

x = class1() 
x@attribute1 = 1 
method1(x, input = 2) 
method1(x)
+4

Source: https://habr.com/ru/post/1695362/


All Articles