2017-02-19 9 views
1

큰 멀티 밴드 래스터에서 계산을 실행하고 RasterBrick을 내보내고 메모리의 목적으로 래스터 패키지에서 calc() 함수를 사용하려고합니다. 능률. 이 기능은 그 자체로 잘 실행,하지만 난 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

따라서, 함수, 그것은 일을하더라도, 아마 당신에게 잘못된 결과를 줄 것이다. 하지만 기능이 제대로 작동하지 않는 이유에 대해서는 잘 모르겠습니다. cellStats의 사용을 피하기 위해 내부 검사가 calc 일 수도 있습니다.

는 "당신의"계산을 수행하려면, 그러나, 당신은 간단하게 사용할 수 있습니다

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