Ошибка вызова функции с оператором return

Я хочу обработать собственную разработанную функцию в каждой ячейке, используя функцию 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?


person nmatton    schedule 23.01.2019    source источник
comment
Вероятно, есть случаи, когда точка изменения не обнаружена. Тогда idx будет нулевым, а years[idx] будет вектором нулевой длины. Очевидно, calc() не нравится вектор нулевой длины. Или, возможно, проблема в том, что обнаружено более одной точки изменения. У нас нет ваших данных, и мы не можем сказать.   -  person user2554330    schedule 23.01.2019
comment
Спасибо ! Я проверю ваши предложения, а там ссылка на входные данные (конец поста, перед правкой)   -  person nmatton    schedule 24.01.2019


Ответы (1)


Комментарий пользователя 2554330 поставил меня на правильный путь, проблема заключалась в том, что 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)
person nmatton    schedule 24.01.2019