[R-sig-Geo] difficulties on applying a function trough calc on a rasterstack
Robert J. Hijmans
r.hijmans at gmail.com
Mon Aug 8 21:29:24 CEST 2016
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
More information about the R-sig-Geo
mailing list