我想使用“光栅”包的calc函数在每个单元上处理自己设计的函数。
当我尝试打印该函数的“最终”结果(我想返回的值)时,一切工作都很好,但是当我尝试使用return语句时,出现了一个错误:
Error in .local(x, values, ...) :
values must be numeric, integer or logical.
这是导致该错误的代码
inR <- 'D://test/TS_combined_clipped.tif'
outR <- 'D://test/R_test3.tif'
rasterB <- brick(inR)
fun1 <-function(x){
years = seq(1, 345)
na_idx = which(is.na(x))
years = years[-na_idx]
x <- na.omit(x)
idx = detectChangePoint(x, cpmType='Student', ARL0=500)$changePoint
return(years[idx]) # this raises error
# print(years[idx]) # This does *not* raises any error
}
r <- calc(rasterB, fun=fun1, filename=outR, overwrite=TRUE)
如何有一个return语句使它失败?
我的某些测试导致以下事实:似乎在rasterBrick的最后一个单元上执行calc函数之后,该过程失败了。 但是我不知道从哪里开始尝试解决此问题。
[编辑]
我刚刚注意到,如果我使用return(idx)
而不是return(year[idx])
,则该过程可以正常进行,而不会引发错误。
因此,似乎问题更多在获取year变量的值。
因此,在使用带有R的索引时是否会遗漏任何特定的东西?
答案 0 :(得分:1)
user2554330的评论使我步入正轨,问题是calc无法处理“数字(0)”结果。
然后是更新的代码
inR <- 'D://test/TS_combined_clipped.tif'
outR <- 'D://test/R_test3.tif'
rasterB <- brick(inR)
fun1 <-function(x){
years = seq(1, 345)
na_idx = which(is.na(x))
years = years[-na_idx]
x <- na.omit(x)
idx = detectChangePoint(x, cpmType='Student', ARL0=500)$changePoint
if (idx==0){
return(0)
} else {
return(as.integer(years[idx]))
}
}
r <- calc(rasterB, fun=fun1, filename=outR, overwrite=TRUE)