自己的焦点统计功能(焦点,“光栅”包,R)给出错误的输出

时间:2017-10-19 08:03:10

标签: r geospatial raster

我是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:win,y = 1:win,z =(d - mean(d))):   参数“d”缺失,没有默认值

我假设窗口中的数据自动在函数中传输。我的代码中有什么错误?谢谢!

更新。对于测试需要加载库“谱”:

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

1 个答案:

答案 0 :(得分:0)

首先,要使用之前在focal()中定义的函数,只需删除函数名后面的括号()即可。

其次,使用spectral::spec.fft的函数需要z参数作为矩阵。但是,正如我们从?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)