Rev 60126 | 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.# Copyright (C) 1997-8 The R Core Teamopen.account <- function(total) {list(deposit = function(amount) {if(amount <= 0)stop("Deposits must be positive!\n")total <<- total + amountcat(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 - amountcat(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..