Я хочу обработать собственную разработанную функцию в каждой ячейке, используя функцию 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)
Как возможно иметь оператор возврата, чтобы сделать его неудачным?
Некоторые мои тесты приводят к тому, что кажется, что процесс завершается сбоем сразу после выполнения функции calc на самой последней ячейке rasterBrick. Но я понятия не имею, с чего начать, чтобы попытаться исправить это.
Исходное изображение доступно здесь
[ИЗМЕНИТЬ]
Я только что заметил, что если я использую return(idx)
вместо return(year[idx])
, процесс работает без ошибок. Таким образом, кажется, что проблема больше связана с получением значения переменной year. Поэтому есть ли что-то особенное, что я пропустил при использовании индексов с R?
idx
будет нулевым, аyears[idx]
будет вектором нулевой длины. Очевидно,calc()
не нравится вектор нулевой длины. Или, возможно, проблема в том, что обнаружено более одной точки изменения. У нас нет ваших данных, и мы не можем сказать. - person user2554330   schedule 23.01.2019