dwww Home | Show directory contents | Find package

## 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.

#  Copyright (C) 1997-8 The R Core Team

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()
try(ross$withdraw(500)) # no way..

Generated by dwww version 1.15 on Tue Jul 2 08:54:20 CEST 2024.