运行覆盖时出现r raster clusterR错误

时间:2018-07-24 19:23:45

标签: r parallel-processing r-raster

我正在尝试编写一个函数以在栅格上运行多个并发的按单元计算。我的希望是使用光栅包的内置并行处理代码来加快处理速度。

我收到一个错误:“ get(name,envir = envir)出错:找不到对象'mn'”。该错误发生在下面的#####错误此处#####标记处,该标记正试图运行raster :: overlay。

我看到此错误是由于get函数引起的,并且表明mn对象并非对所有集群都可访问。

如何编写此代码,以使对象位于适当的环境中?谢谢。

这是我的代码的基本版本:

SendC

2 个答案:

答案 0 :(得分:0)

您正在./a.out中设置xy,但使用overlay()datamnz作为参数。使用:

sd

建议 :(始终提供示例数据)

z <- raster::clusterR(x = data, fun = function(data, mn){ raster::overlay(x = data, y = mn, fun = function(x, y){ x - y }, na.rm = na.rm }, export = mn)

z <- raster::clusterR(x = data, fun = function(z, sd){ raster::overlay(x = z, y = sd, fun = function(x, y){ x / y }, na.rm = na.rm) }, export = sd)

enter image description here

答案 1 :(得分:0)

要使用多波段栅格,可以将clusterR函数滚动到for循环中。

    # example data
    data("Rlogo")
    data <- raster::brick(Rlogo)

    # calculate sd
    sd <- raster::calc(data, sd)

    # calculate mean (mean of layer x is mean of all layers but x)
    mn <- data
    set <- 1:nlayers(data)
    for (i in set) {
      subset <- set[-i]
      wrk <- raster::stack(x = data, bands = subset)
      mn_i <- raster::calc(x = wrk, fun = mean)
      mn[[i]] <- mn_i
    }

    # calculate z score
    z <- data
    set <- 1:nlayers(data)
    fun1 <- function(x,y){x-y}
    raster::beginCluster()
    for (i in set){
      wrk <- raster::stack(data[[i]], mn[[i]])
      z_i <- clusterR(x = wrk, fun = raster::overlay, arg = list(fun = fun1))
      z[[i]] <- z_i
      rm(z_i, wrk)
    }

    # normalize z score
    fun2 <- function(x,y){x/y}
    for(i in set){
      wrk <- raster::stack(z[[i]], sd)
      z_i <- clusterR(x = wrk, fun = raster::overlay, arg = list(fun = fun2))
      z[[i]] <- z_i
      rm(z_i, wrk)
    }
    raster::endCluster()