2017-10-19 2 views
1

Ich bin ein Anfänger in R und Programmierung. Also denke ich, als die Frage ist einfach, aber ich kann die Antwort nicht finden oder es solus lösen.Eigene Funktion für fokale Statistik (fokal, "Raster" -Paket, R) gibt falsche Ausgabe

Ich habe das Raster (100 * 100 Zellen). Ich muss den Medianwert der harmonischen Größen durch 2D-DFT am sich bewegenden Fenster erhalten (zum Beispiel Größe des Fensters = 21). Ich habe die Fokusfunktion im Rasterpaket gefunden. Für diese Funktion kann ich eine eigene Funktion kodieren, die seria von Werten (Rasterwerte im Fenster) und einen individuellen Wert für das ganze Fenster zurückgibt.

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()) 

Der Ausgang: Fehler in spec.fft (x = 1: win, y = 1: win, z = (d - mean (d))): Argument "d" fehlt, wird mit nein Standard

Ich vermutete, dass Daten aus dem Fenster in der Funktion automatisch übertragen werden. Was ist der Fehler in meinem Code? Vielen Dank!

UPDATE. Für die Prüfung ist, müssen die Bibliothek „spektralen“ laden:

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

Antwort

0

Erstens, um die Funktion, die Sie vorher in focal() definiert verwenden zu können, müssen Sie nur die Klammern () nach dem Funktionsnamen entfernen.

Zweitens, Ihre Funktion mit spectral::spec.fft, die das z Argument eine Matrix sein muss. Allerdings wird ein Vektor von Werten, wie wir aus ?focal lernen:

Die Funktion Spaß sollte mehrere Zahlen nehmen und eine einzelne Zahl zurückgeben.

Daher müssen Sie die erforderliche Matrix selbst erzeugen.

Sehen Sie dieses Beispiel (aber überprüfen Sie bitte für die Gültigkeit der Ausgabe):

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 
        ))) 
} 

ist die Funktion in 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

Danke, Loki verwenden lassen! Es war wirklich einfach. Aber ich vermute, dass der Fehler in der Funktion "spectr" ist. Ihr Code funktioniert) –

+0

Siehe die aktuelle Version. Ich habe meine Antwort bearbeitet – loki

Verwandte Themen