函数使用return语句引发错误

时间:2019-01-23 12:33:06

标签: r raster calc

我想使用“光栅”包的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函数之后,该过程失败了。 但是我不知道从哪里开始尝试解决此问题。

Input image is available here

[编辑]

我刚刚注意到,如果我使用return(idx)而不是return(year[idx]),则该过程可以正常进行,而不会引发错误。 因此,似乎问题更多在获取year变量的值。 因此,在使用带有R的索引时是否会遗漏任何特定的东西?

1 个答案:

答案 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)