R is widely seen as being ‘slow’ (see julia web page)
But, if you use a few specific tools, then this becomes irrelevant because of the powerful tools in various packages in R
Pure R, when the most efficient vectorized code is used, appears to be 1/2x the speed of the most efficient C++.
See Hadley Wickham’s page on Rcpp, scroll down to “Vector input, vector output”… ), noting that if it took 10 minutes to write the C++ code, it would have to be 150,000 times faster to make it worth it.
Spatial simulation means doing the same thing over and over and over … so we need speed
We will show how to profile your code at the end of this section.
# Instead of
a <- vector()
for (i in 1:1000) {
a[i] <- rnorm(1)
}
# use vectorized version, which is built into the functions
a <- rnorm(1000)
data.frame
base
package – everything matrix or vector is ‘fast’raster
- for spatially referenced matrices
sp
- equivalent of vector shapefiles in a GIS
data.table
data.frame
type data (i.e., columns of data)data.frame
is small (<100,000 rows)SpaDES
– many functions; will be moved into a separate package soon
Rcpp
SpaDES
functions quickly, because there are fewer tutorials online for theseraster
, sp
, data.table
, Rcpp
SpaDES
functions?`spades-package` # section 2 shows many functions
# e.g.,
?spread
?move
?cir
?adj
?distanceFromEachPoint
tutorials
Tutorials
data.table
packageFrom every data.table
user ever:
install.packages('data.table')
(at least for large tables!)
data.table
tutorialsraster
and data.table
togetherThe current implementation of LANDIS-SpaDES
uses a “reduced” data structure throughout
Instead of keeping rasters of everything (one can imagine that there is redundancy, i.e., 2 pixels next to each other may be identical)
We make one raster of “id” and one data.table with a column called “id”
Then we can have as many columns as we want of information about each of these places
Like “polygons”, but for rasters, and dynamic… can change over time
This may be useful for your own module
raster
and data.table
together?rasterizeReduced
What does this do?
Rcpp
packageFrom every Rcpp
user ever:
install.packages('Rcpp')
AFTER that, then you can use 2 great tools:
profvis
package (built into the latest Rstudio previews, but not the official release version)microbenchmark
packagemicrobenchmark::microbenchmark(
loop = {
a <- vector()
for (i in 1:1000) a[i] <- rnorm(1)
},
vectorized = { a <- rnorm(1000) }
)
## Unit: microseconds
## expr min lq mean median uq max
## loop 3601.977 4047.6055 4638.40080 4169.4605 4366.394 34951.379
## vectorized 70.972 72.5855 76.47407 73.3185 74.491 185.642
## neval
## 100
## 100
If you have Rstudio version >=0.99.1208
, then it has profiling as a menu item.
alternatively, we wrap any block of code with profvis
This can be a spades()
call, so it will show you the entire model:
profvis::profvis({a <- rnorm(10000000)})
spades
callTry it:
mySim <- simInit(
times = list(start = 0.0, end = 2.0, timeunit = "year"),
params = list(
.globals = list(stackName = "landscape", burnStats = "nPixelsBurned")
),
modules = list("randomLandscapes", "fireSpread", "caribouMovement"),
paths = list(modulePath = system.file("sampleModules", package = "SpaDES"))
)
profvis::profvis({spades(mySim)})
If you have used these tools, then:
SpaDES
model callBuilding models with modules …