函数使用 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 函数后,该过程似乎就失败了。
但是我不知道从哪里开始尝试解决这个问题。
[编辑]
我刚刚注意到,如果我使用 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)
我想使用 "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 函数后,该过程似乎就失败了。 但是我不知道从哪里开始尝试解决这个问题。
[编辑]
我刚刚注意到,如果我使用 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)