The R Project SVN R

Rev

Rev 3076 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed


## Here is a little example which shows a fundamental difference between
## R and S.  It is a little example from Abelson and Sussman which models
## the way in which bank accounts work. It shows how R functions can
## encapsulate state information.
##
## When invoked, "open.account" defines and returns three functions
## in a list.  Because the variable "total" exists in the environment
## where these functions are defined they have access to its value.
## This is even true when "open.account" has returned.  The only way
## to access the value of "total" is through the accessor functions
## withdraw, deposit and balance.  Separate accounts maintain their
## own balances.
##
## This is a very nifty way of creating "closures" and a little thought
## will show you that there are many ways of using this in statistics.

open.account <- function(total) {

    list(
     deposit = function(amount) {
         if(amount <= 0)
         stop("Deposits must be positive!\n")
         total <<- total + amount
         cat(amount,"deposited. Your balance is", total, "\n\n")
     },
     withdraw = function(amount) {
         if(amount > total)
         stop("You don't have that much money!\n")
         total <<- total - amount
         cat(amount,"withdrawn.  Your balance is", total, "\n\n")
     },
     balance = function() {
         cat("Your balance is", total, "\n\n")
     }
     )
}

ross <- open.account(100)
robert <- open.account(200)

ross$withdraw(30)
ross$balance()
robert$balance()

ross$deposit(50)
ross$balance()
ross$withdraw(500)