Learn R Programming

terra (version 0.7-11)

lapp: Apply a function to layers of a SpatRaster, or to sub-datasets of a SpatDataSet

Description

Apply a function to layers of a SpatRaster ("overlay").

The number of arguments in function fun must match the number of layers in the SpatRaster (or the number of sub-datasets in the SpatDataSet). For example, if you want to multiply two layers, you could use this function : fun=function(x,y){return(x*y)} percentage: fun=function(x,y){return(100 * x / y)}. If you combine three layers you could use fun=function(x,y,z){return((x + y) * z)}

Before you use the function, test it to make sure that it works for vectors (not only for single numbers). That is, it must return the same number of elements as its input vectors, or multiples of that. Make sure it also returns the same number of values when some or all input values are NA. Also, the function must return a vector or matrix, not a data.frame.

Use app for summarize functions such as sum, that take any number of arguments.

Usage

# S4 method for SpatRaster
lapp(x, fun, ..., usenames=FALSE, filename="", overwrite=FALSE, wopt=list())

# S4 method for SpatDataSet lapp(x, fun, ..., recycle=FALSE, filename="", overwrite=FALSE, wopt=list())

Arguments

x

SpatRaster or SpatDataSet

fun

function to be applied

...

additional arguments to be passed to fun

usenames

logical. Use the layer names to match the function arguments? If FALSE matching is by position

recycle

logical. Recycle layers to match the subdataset with the largest number of layers

filename

character. Output filename. Optional

overwrite

logical. If TRUE, filename is overwritten

wopt

list. Options for writing files as in writeRaster

Value

SpatRaster

See Also

app, tapp, math

Examples

Run this code
# NOT RUN {
s <- rast(system.file("ex/logo.tif", package="terra"))   
ss <- s[[2:1]]

fvi <- function(x, y){ (x - y ) / (x + y) } 
x <- lapp(ss, fun=fvi )

# which is the same as supplying the layers to "fun"
# in some cases this will be much faster 
y <- fvi(s[[2]], s[[1]])

f2 <- function(x, y, z){ (z - y + 1) / (x + y + 1) } 
p1 <- lapp(s, fun=f2 )

p2 <- lapp(s[[1:2]], f2, z=200)

# the usenames argument

fvi2 <- function(red, green){ (red - green ) / (red + green) } 
names(s)
x1 <- lapp(s[[1:2]], fvi2, usenames=TRUE)
x2 <- lapp(s[[2:1]], fvi2, usenames=TRUE)
# x2 is different from x1 as the order of the layers has changed
# but x3 and x4 are the same as x1 
x3 <- lapp(s[[2:1]], fvi2, usenames=FALSE)
x4 <- lapp(s, fvi2, usenames=TRUE)

# while this would give an error because 
# there are too many layers in s
# x5 <- lapp(s, fvi2, usenames=FALSE)

pairs(c(x1, x2, x3, x4))

## SpatDataSet
x <- sds(s, s[[1]]+50)
lapp(x, function(x, y) x/y, recycle=TRUE)
# }

Run the code above in your browser using DataLab