r <- raster(ncols=36, nrows=18, xmn=0)
r[] <- runif(ncell(r))
# 3x3 mean filter
r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3))
# 5x5 mean filter
r5 <- focal(r, w=matrix(1/25,nrow=5,ncol=5))
# Gaussian filter for square cells
fgauss <- function(sigma, n=5) {
m <- matrix(nc=n, nr=n)
col <- rep(1:n, n)
row <- rep(1:n, each=n)
x <- col - ceiling(n/2)
y <- row - ceiling(n/2)
# according to http://en.wikipedia.org/wiki/Gaussian_filter
m[cbind(row, col)] <- 1/(2*pi*sigma^2) * exp(-(x^2+y^2)/(2*sigma^2))
# sum of weights should add up to 1
m / sum(m)
}
gf=fgauss(1.5)
rg <- focal(r, w=gf)
# The max value for the lower-rigth corner of a 3x3 matrix around a focal cell
f = matrix(c(0,0,0,0,1,1,0,1,1), nrow=3)
f
rm <- focal(r, w=f, fun=max)
# global lon/lat data: no 'edge effect' for the columns
xmin(r) <- -180
r3g <- focal(r, w=matrix(1/9,nrow=3,ncol=3))
## focal can be used to create a cellular automaton
# Conway's Game of Life
w <- matrix(c(1,1,1,1,0,1,1,1,1), nr=3,nc=3)
gameOfLife <- function(x) {
f <- focal(x, w=w, pad=TRUE, padValue=0)
# cells with less than two or more than three live neighbours die
x[f<2 | f>3] <- 0
# cells with three live neighbours become alive
x[f==3] <- 1
x
}
# simulation function
sim <- function(x, fun, n=100, pause=0.25) {
for (i in 1:n) {
x <- fun(x)
plot(x, legend=FALSE, asp=NA, main=i)
dev.flush()
Sys.sleep(pause)
}
invisible(x)
}
# Gosper glider gun
m <- matrix(0, nc=48, nr=34)
m[c(40, 41, 74, 75, 380, 381, 382, 413, 417, 446, 452, 480,
486, 517, 549, 553, 584, 585, 586, 619, 718, 719, 720, 752,
753, 754, 785, 789, 852, 853, 857, 858, 1194, 1195, 1228, 1229)] <- 1
init <- raster(m)
# run the model
sim(init, gameOfLife, n=150, pause=0.05)
Run the code above in your browser using DataLab