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