2017-02-19 31 views
1

Мне нужно выполнить вычисления на больших многодиапазонных растровках и экспортировать RasterBrick, и я пытаюсь это сделать, используя функцию в растровом пакете для целей памяти эффективность. Функция работает нормально сама по себе, но когда я пытаюсь включить его в calc(), я получаю эту ошибку:Ошибка при использовании функции calc(): не может использовать эту функцию

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : cannot use this function

Как я могу сделать эту работу?

упрощенный код:

fn = system.file("external/test.grd", package="raster") 
s = stack(fn, fn, fn, fn) 

out = calc(s, fun = function(x){ 
    for (i in 1:nlayers(x)){ 
    x[[i]] = x[[i]] - cellStats(x[[i]], "min") 
    x[[i]] = x[[i]]* 5 
    } 
    list = unstack(x) 
    out = brick(list) 
    return(out) 
} 
) 

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : 
    cannot use this function 

ответ

1

С calc помощь:

For large objects calc will compute values chunk by chunk. This means that for the result of fun to be correct it should not depend on having access to all values at once. For example, to scale the values of a Raster* object by subtracting its mean value (for each layer), you would not do, for Raster object x:

calc(x, function(x)scale(x, scale=FALSE))

Because the mean value of each chunk will likely be different. Rather do something like

m <- cellStats(x, 'mean')

x - m

поэтому, ваша функция, даже если он работал, вероятно, даст вам неправильные результаты. Я не совсем уверен, почему функция не работает, однако: возможно, там есть внутренняя проверка в calc, чтобы избежать использования cellStats.

Чтобы сделать "свой" вычисления, однако, вы могли бы просто использовать:

out = s 
for (i in 1:nlayers(s)) { 

    out [[i]] = (s [[i]] - cellStats(s[[i]], 'min', na.rm = T))*5 

} 
+1

Спасибо! Оказывается, функция не работает из-за цикла for. Оказывается, 'calc' отличает полосы и индексы самостоятельно. Ваше решение - это то, что у меня было раньше, но мне нужно «calc», потому что он эффективнее с точки зрения памяти. Что касается 'cellStats', то я был худшим, имея значения NA. – Danple

+0

рад, что вы его решили. Однако имейте в виду предупреждение в помощи: если вы пытаетесь вычесть среднее значение из каждого уровня, а 'calc' работает в кусках, вы будете иметь неправильные выходы (т. Е. Значение, которое вы вычитаете в первую группу линий будет отличаться от того, который вы вычтите из последнего). – lbusett