difficulties on applying a function trough calc on a rasterstack
Works for me like this
library(raster)
r1 <- raster (matrix(ncol=3, data = 1,nrow = 3))
r2 <- raster (matrix(ncol=3, data = 21,nrow = 3))
r3 <- raster (matrix(ncol=3, data = 72,nrow = 3))
rst <- stack(r1, r2, r3)
calc (rst, mfri.test)
Here is an improved version (I think) of mfri.test
mfri.test2 <- function (a){
a2 <- sort(unique(a[a>0]))
n <- length(a2)
if (n==0) {
b <-0
} else if (n==1){
b <- a2
} else {
b <- diff(a2)
}
if (a2[n] != 85){
b <- c(b, 85 - a2[n])
}
return (mean(b))
}
On Fri, Aug 5, 2016 at 10:21 AM, Pep SD <pep.bioalerts at gmail.com> wrote:
Hello everyone,
I feel this may be R-raster 101 but I can't really find the solution to
this.
I want to apply a function over a rasterstack, so that it outputs a raster
layer in which the function has been applied to each cell of the
rasterstack.
#function to pass
mfri.test <- function (a){
a2 <- a[a>0]
a2 <- unique (a2)
a2 <- a2[order(a2)]
if (length (a2)==0){b<-0}else{
if (length (a2)==1){b<-c(a2)}
if (length (a2)>1) {
b <- lapply (1:(length(a2)-1), function (m){
a2[m+1]-a2[m]
})
b<- unlist (b)
}
if (a2[length(a2)]!=85){m <- c(85-a2[length(a2)]); b <- c(b,m) }}
return (mean(b))
}
#now let's try it on a vector -- ideally mm represents a single cell values
on a rasterStack
mm <-c(0,3,4,65,89)
mfri.test(a=mm)
[1] 20.5
#now let's try it with a small raster
r <- raster (matrix(ncol=1,data = 1,nrow = 1))
r2 <- raster (matrix(ncol=1,data = 21,nrow = 1))
r3 <- raster (matrix(ncol=1,data = 72,nrow = 1))
rst <- stack(r,r2,r3)
calc (rst,function (x) { mfri.test(x)},na.rm=T )
Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) :
cannot use this function. Perhaps add '...' or 'na.rm' to the function
arguments?
# Is it because the function is poorly written? what am I doing wrong?
Thank you for your help,
Pep
P.S. SessionInfo below
sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server 2008 R2 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
States.1252
[3] LC_MONETARY=English_United States.1252
LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] raster_2.3-40 sp_1.1-1
loaded via a namespace (and not attached):
[1] tools_3.3.0 grid_3.3.0 lattice_0.20-33
[[alternative HTML version deleted]]
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo