我写了以下函数,以获得最早的朱利安日,累积学位日超过广州开发区。
## 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()
来完成此工作?
答案 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)
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))