Amit
Amit

Reputation: 41

R refClass Methods

I am using R refClass example below.

Person =  setRefClass("Person",fields = list(name = "character", age  = "numeric")
            ) ## Person = setRefClass("Person",


Person$methods = list(
              increaseAge <- function(howMuch){
                age = age + howMuch
              }
          )

When I store this program in a file called Person.R and source it, it does not show any errors. Now I instantiate a new object.

p = new("Person",name="sachin",age=40)

And I try to invoke the method increaseAge, using p$increaseAge(40), and it shows the following error

Error in envRefInferField(x, what, getClass(class(x)), selfEnv) :
  "increaseAge" is not a valid field or method name for reference class "Person"

I cannot figure out why it says that the method increaseAge is not a valid method name when I have defined it.

Upvotes: 1

Views: 249

Answers (2)

Martin Morgan
Martin Morgan

Reputation: 46886

To specify a method independent of class definition, invoke the methods() function on the generator. Also, use either <<- or .self$age = for the assignment.

Person$methods(increaseAge=function(howMuch) {
    age <<- age + howMuch
    ## alterenatively, .self$age = age + howMuch or .self$age <- age + howMuch
})

Remember that R works best on vectors, so think of a Persons class (modeling columns) representing all the individuals in your study, rather than a collection of Person instances (modeling rows).

Upvotes: 2

agstudy
agstudy

Reputation: 121608

I get an error using your code. I would do something like this:

Person =  setRefClass("Person",
                      fields = list(name = "character", age  = "numeric"),
                      methods = list(
                        increaseAge = function(howMuch) age <<- age + howMuch
                      ))

> p = new("Person",name="sachin",age=40)
> p$increaseAge(5)
> p$age
[1] 45

Upvotes: 0

Related Questions