51 lines
1.5 KiB
R
51 lines
1.5 KiB
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..
|