【问题标题】:Own function for focal statistics (focal, "raster" package, R) gives incorrect output自己的焦点统计函数(焦点,“光栅”包,R)给出不正确的输出
【发布时间】:2018-03-31 05:11:11
【问题描述】:

我是 R 和编程的初学者。所以我认为这个问题很简单,但我无法找到答案或解决它。

我有栅格(100*100 个单元格)。我需要在移动窗口处通过 2D DFT 获得谐波幅度的中值(例如,窗口大小 = 21)。 我在 raster 包中找到了焦点函数。对于这个函数,我可以编写自己的函数,它采用一系列值(窗口中的光栅值)并返回整个窗口的单个值。

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)

【问题讨论】:

    标签: r geospatial raster


    【解决方案1】:

    首先,要使用你之前在focal()中定义的函数,你只需要去掉函数名后面的括号()

    其次,您的函数使用spectral::spec.fft,它要求z 参数是一个矩阵。但是,正如我们从 ?focal 中学到的那样,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)
    

    【讨论】:

    • 谢谢你,洛基!这真的很简单。但我认为函数“spectr”中的错误。您的代码有效)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2015-06-09
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多