2017-10-19 1 views
1

저는 R 및 프로그래밍의 초보자입니다. 그래서 질문은 간단하다고 생각합니다. 그러나 대답을 찾거나 솔리 만 해결할 수는 없습니다.초점 통계 (초점, "래스터"패키지, R)에 대한 자체 기능이 올바르지 않습니다.

래스터 (100 * 100 셀)가 있습니다. 움직이는 창에서 2D DFT로 고조파 크기의 중앙값을 구해야합니다 (예 : 창 크기 = 21). 래스터 패키지에서 초점 기능을 찾았습니다. 이 함수에서는 값의 치리아 (창에서 래스터 값)를 취하여 전체 창에 대한 개별 값을 반환하는 자체 함수를 코딩 할 수 있습니다.

r <- raster(matrix(rnorm(10000), nrow = 100, ncol = 100)) # creation of raster 
win <- 21 # setting the window size 
spectr <- function(d) { 
    return(median(abs(spec.fft(x = 1:win, y = 1:win, z = (d - mean(d)))$A))) 
} # i think "d" - the matrix of raster values in the window border 
focal(x = r, w = matrix(1, win, win), fun = spectr()) 

출력 : spec.fft 내부 오류 (X = 1 : 승, Z = (d - 평균 (d)) : 상금, Y는 1 = 없음) 없음으로 인수 "D"누락 default

나는 창에서 데이터가 자동으로 함수에서 전송되는 것으로 추정했다. 내 코드의 실수는 무엇입니까? 고맙습니다!

업데이트. 테스트를 위해 라이브러리 "스펙트럼"을로드 할 필요가 있습니다 :

install.packages("spectral") 
library(spectral) 

답변

0

먼저 focal() 이전에 정의 된 기능을 사용하려면, 당신은 함수 이름 뒤에 ()을 괄호를 제거해야합니다.

두 번째로 인수가 필요한 spectral::spec.fft을 사용하는 함수는 행렬입니다. 그러나 초점은 값 벡터를 다음과 같이 전달합니다. ?focal :

fun는 여러 개의 숫자를 사용하고 단일 숫자를 반환해야합니다.

따라서 필요한 매트릭스를 직접 생성해야합니다.

는 (단, 출력의 유효성을 확인하시기 바랍니다)이 예를 참조하십시오

spectr <- function(d) { 
    return(median(abs(spec.fft(x = 1:win, y = 1:win, 
          z = (matrix(d, ncol = win, nrow = win) - mean(d)))$A 
          # eventually you have to reorder or transpose the matrix 
          # if its order has some impact on spec.fft 
        ))) 
} 

이, 로키 감사의가 focal()

focal(x = r, w = matrix(1, win, win), fun = spectr) 
# class  : RasterLayer 
# dimensions : 100, 100, 10000 (nrow, ncol, ncell) 
# resolution : 0.01, 0.01 (x, y) 
# extent  : 0, 1, 0, 1 (xmin, xmax, ymin, ymax) 
# coord. ref. : NA 
# data source : in memory 
# names  : layer 
# values  : 0.03341064, 0.04557778 (min, max) 
+0

에서 함수를 사용하자! 정말 간단했습니다. 그러나 나는 함수 "spectr"의 실수라고 생각했다. 귀하의 코드 작동) –

+0

현재 버전보기. 내 대답을 편집했습니다. – loki