Ошибка повышения функции с оператором return - PullRequest
0 голосов
/ 23 января 2019

Я хочу обработать собственную функцию для каждой ячейки, используя функцию calc пакета "растр".

Все работает отлично, когда я пытаюсь напечатать "окончательный" результат функции (значение Iхочу вернуться), но когда я пытаюсь использовать оператор 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.Но я понятия не имею, с чего начать, чтобы попытаться это исправить.

Входное изображение доступно здесь

[EDIT]

Я только что заметил, что если я использую return(idx) вместо return(year[idx]), процесс работает без возникновения ошибки.Таким образом, похоже, что проблема больше в получении значения переменной года.Поэтому есть ли какая-то особенная вещь, которую я упустил при использовании индексов с R?

1 Ответ

0 голосов
/ 24 января 2019

Комментарий 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...