我正在尝试编写一个函数以在栅格上运行多个并发的按单元计算。我的希望是使用光栅包的内置并行处理代码来加快处理速度。
我收到一个错误:“ get(name,envir = envir)出错:找不到对象'mn'”。该错误发生在下面的#####错误此处#####标记处,该标记正试图运行raster :: overlay。
我看到此错误是由于get函数引起的,并且表明mn对象并非对所有集群都可访问。
如何编写此代码,以使对象位于适当的环境中?谢谢。
这是我的代码的基本版本:
SendC
答案 0 :(得分:0)
您正在./a.out
中设置x
和y
,但使用overlay()
,data
,mn
和z
作为参数。使用:
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)
答案 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()