使用calc()函数

时间:2018-05-01 08:24:53

标签: r raster

我写了以下函数,以获得最早的朱利安日,累积学位日超过广州开发区。

## data
s <- stack(list.files("daily_Temperature"))

## myfun() function
myfun <- function(x, start, GDD) {
 i <- start
  repeat{
   if(sum(x[start:i], na.rm=T) >= GDD) {break}
   i <- i+1
  }
  i
 }

## calc() function
start <- raster("Raster_contains_certain_julian_dates.tif") #same resolution&extend
calc(s, fun=myfun)

当我使用简单向量运行myfun()时,它可以工作。

v <- c(10, 13, 15, 14, 16)
myfun(x=v, start=1, GDD=40)

但是当我在myfun()函数中使用calc()时,控制台会返回一些错误。

cannot use this function

如何使用s使用calc()来完成此工作?

1 个答案:

答案 0 :(得分:2)

这是一个提案。使用raster作为calc函数的参数时,您应该在stack的末尾添加它,以便能够在函数中调用它。

功能

## myfun() function
myfun <- function(x) {
  start <- x[n] 
  i <- 0
  while (i < n){
    if(sum(x[start:i], na.rm=T) >= GDD) {break}
    i <- i+1
  }
  if (i == n){NA}else{i}
}

代码

s <- stack(r1,r2,r3,r4,r5,start)
n <- nlayers(s)
GDD <- 40
output <- calc(s, fun = myfun)

plot(output)

enter image description here

样本数据

library(raster)

set.seed(1)
# Generate rasters of random values
r1 <- r2 <- r3 <- r4 <- r5 <- start <- raster(ncol=10, nrow=10)

r1[] <- round(runif(ncell(r1), 5, 15))
r2[] <- round(runif(ncell(r2), 5, 15))
r3[] <- round(runif(ncell(r3), 5, 15))
r4[] <- round(runif(ncell(r4), 5, 15))
r5[] <- round(runif(ncell(r5), 5, 15))
s <- stack(r1,r2,r3,r4,r5)

start[] <- round(runif(ncell(start), 1, 3))