Reputation: 339
My current project is using S4 objects and I would like to access the generic methods like in python or C. Here is the example
setClass("Account",
representation(balance = 'numeric', holder = 'character'),
prototype = prototype(balance = NA_real_, holder = NA_character_),
validity = function(object) {
if (object@balance < 10) {
return("The start balance should not be negative")
}
return(TRUE)
})
setMethod("show", signature = "Account",
definition = function(object) {
cat("The account holder is", object@holder, "\n")
cat("The account balance is", object@balance, "\n")
})
setGeneric("deposit", def = function(.Object, amount) {
standardGeneric("deposit")
})
setMethod("deposit", signature = "Account",
definition = function(.Object, amount) {
nameObject <- deparse(substitute(.Object))
.Object@balance <- .Object@balance + amount
assign(nameObject, .Object, envir = parent.frame())
return(invisible())
})
Currently I can use the following:
acc <- new("Account", balance = 10, holder = "nal-ra")
deposit(acc, 20)
acc
#> The account holder is nal-ra
#> The account balance is 30
I would like use the acc$.$deposit(20)
instead of deposit(acc, 20)
.
I know that reference class and R6 class can do the job, but my project can not use them.
Upvotes: 1
Views: 208
Reputation: 46856
S4 methods don't work that way. Instead, update and return the object
setMethod("deposit", signature = "Account",
definition = function(.Object, amount) {
.Object@balance <- .Object@balance + amount
.Object
})
acc = deposit(acc, 20)
A different formulation would be to write a deposit<-
replacement method
setGeneric("deposit<-", function(x, value) standardGeneric("deposit<-"))
setReplaceMethod("deposit", c("Account", "numeric"), function(x, value) {
x@balance <- x@balance + value
x
})
with
> acc <- new("Account", balance = 10, holder = "nal-ra")
> deposit(acc) <- 20
> acc
The account holder is nal-ra
The account balance is 30
Upvotes: 2