home *** CD-ROM | disk | FTP | other *** search
- ###-*- R -*-
- # 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)
-