packrat/lib-R/base/demo/scoping.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.

#  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..
UBC-MDS/Karl documentation built on May 22, 2019, 1:53 p.m.