2017-10-19 9 views
1

私はRとプログラミングの初心者です。だから、質問は単純だと思うが、答えを見つけたり、それを解決したりすることはできない。フォーカル統計(フォーカス、 "ラスタ"パッケージ、R)のための独自の関数は、間違った出力を与えます

私はラスター(100 * 100セル)を持っています。動いているウィンドウ(例えば、ウィンドウのサイズ= 21)で2D DFTを使って高調波の大きさの中央値を取得する必要があります。 ラスターパッケージでフォーカル機能を見つけました。この関数では、値のセリア(ウィンドウ内のラスタ値)を受け取り、ウィンドウ全体の個別の値を返す独自の関数をコーディングすることができます。

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:勝利は、Yは= 1:勝利、Zは=(D - 平均(D))): 引数 "D" が欠けている、ないとデフォルト

私は、ウィンドウからのデータが自動的に関数で送信されると推測しました。私のコードで何が間違っていますか?ありがとうございました!

更新。テストのためのライブラリ「スペクトル」をロードする必要がある:

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

答えて

0

まず、あなたがfocal()で以前に定義された機能を使用するには、あなただけの関数名の後の括弧()を削除する必要があります。

第2に、引数を必要とする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

関連する問題