## ----bank-account--------------------------------------------------------
account <- function(initial=0) {
    available <- initial
    list(deposit=function(amount) {
        available <<- available + amount
        available
    }, balance=function() {
         available
    })
}
my_acct <- account()
my_acct$deposit(100)
your_acct <- account(20)
my_acct$deposit(200)
my_acct$balance()
your_acct$balance()


## ----internals, eval=FALSE-----------------------------------------------
## x <- 1:5; tracemem(x)
## x[1] <- 2L
## x[1] <- 2
## 
## x <- y <- seq(1, 5); tracemem(x)
## x[1] <- 2L
## 
## df <- data.frame(x=1:5, y=5:1)
## tracemem(df); tracemem(df$x)
## df[1,1] <- 2
## 
## m <- matrix(1:10, 2); tracemem(m)
## m[1, 1] <- 2L
## 
## f <- function(x) x[1]
## g <- function(x) { x[1] <- 2L; x }
## tracemem(x <- 1:5); f(x)
## tracemem(x <- 1:5); g(x)


## ----sexp----------------------------------------------------------------
x <- 1:5
.Internal(inspect(x))


## ----sexp-types, eval=FALSE----------------------------------------------
## .Internal(inspect(pi))
## .Internal(inspect(data.frame()))
## .Internal(inspect(function() {}))
## .Internal(inspect(expression(1 + 2)))


## ----named-0-------------------------------------------------------------
.Internal(inspect(1:5))


## ----named-1-------------------------------------------------------------
.Internal(inspect(x <- 1:5))


## ----named-2-------------------------------------------------------------
.Internal(inspect(y <- x <- 1:5))


## ----styles-data---------------------------------------------------------
set.seed(123)
x <- rnorm(10000000)


## ----declarative-find----------------------------------------------------
x[abs(x) > 5 * sd(x)]


## ----imperative-find, eval=FALSE-----------------------------------------
## ans <- numeric()
## for (xi in x)
##     if (xi > 5 * sd(x))
##         ans <- c(ans, xi)


## ----declarative-clamp---------------------------------------------------
x[abs(x) > 5 * sd(x)] <- 5 * sd(x)


## ----imperative-clamp, eval=FALSE----------------------------------------
## for (i in seq_along(x))
##     if (abs(x[i]) > 5 * sd(x))
##         x[i] <- 5 * sd(x)


## ----functional----------------------------------------------------------
df <- data.frame(x=1:5, y=5:1)
x0 <- sapply(names(df), function(x) sqrt(df[[x]]))
x1 <- sapply(names(df), function(x, df) sqrt(df[[x]]), df)
x3 <- sapply(df, function(x, fun) fun(x), sqrt)
x2 <- sapply(df, sqrt)