函数使用 return 语句引发错误

Function raise error with return statement

我想使用 "raster" 包的 calc 函数在每个单元格上处理自己设计的函数。

当我尝试打印函数的 "final" 结果时一切正常(我想要 return 的值),但是当我尝试使用 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 函数后,该过程似乎就失败了。 但是我不知道从哪里开始尝试解决这个问题。

Input image is available here

[编辑]

我刚刚注意到,如果我使用 return(idx) 而不是 return(year[idx]),该过程会正常运行而不会引发错误。 因此,问题似乎更多地在于获取 year 变量的值。 因此,我在使用 R 索引时错过了什么特别的事情吗?

user2554330 的评论让我走上了正轨,问题是 calc 无法处理 "numeric(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)