rclassmethodsr-s4

Setter and getter methods in R programming S4 OOP


I am new to R programming, so this may be a basic question.

I have a class "Student" with 3 properties - name, rollnumber and score. I have set name and rollnumber while creating the object and set score to 0. There are 2 methods to set and get values to score. But setting the value using this method is not retaining in the object. It is still showing the initial score 0 even after setting that to 100 using the setter method.

This is my code -

setClass("Student", slots = list(name = "character", rollnumber="numeric", score="numeric"))
st1 <- new("Student", name="Sachin", rollnumber=24, score=0)

setGeneric("setScore", function(model, score){
  standardGeneric("setScore")
})
setGeneric("getScore", function(model){
  standardGeneric("getScore")
})

setMethod("setScore", signature("Student"), function(model, score){
  model@score <- score
})


setMethod("getScore", signature("Student"), function(model){
  paste0(model@name, "'s score is: ", model@score)
})

setScore(st1, 100)
getScore(st1)

Solution

  • S4 objects are not "reference objects". If you want to change them, you need to make the change and assign the result to a new object. So change your setter to

    setMethod("setScore", signature("Student"), function(model, score){
      model@score <- score
      model
    })
    

    and use it as

    st1 <- setScore(st1, 100)
    

    There are a few different schemes for reference objects. I'd recommend the R6 package rather than the one in base R. You can read about it here: https://r6.r-lib.org/articles/Introduction.html .