[英]Nested parallelized (foreach) R loop with condition
我正在尝试在 R 循环中实现一些并行化来处理大型光栅文件。 我使用了一些非常有用的帖子,但无法使我的代码工作。
这是一个包含三个光栅文件的示例:
library(raster)
#Simulating rasters:
n.size <- 10
env1 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v1 <- runif(ncell(env1)/2, min=0.5, max=1)
v2 <- runif(ncell(env1)/2, min=0, max=0.5)
values(env1) <- c(v1,v2)
env1[c(71:100)] <- NA
env2 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v2 <- runif(ncell(env1)/2, min=0.7, max=1)
v1 <- runif(ncell(env1)/2, min=0, max=0.3)
values(env2) <- c(v1,v2)
env3 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v2 <- runif(ncell(env3)/2, min=0.9, max=1)
v1 <- runif(ncell(env3)/2, min=0, max=0.1)
values(env3) <- c(v1,v2)
myStack <- stack(env1,env2,env3)
plot(myStack)
树栅格具有相同的范围和维度,但第一个栅格具有一些缺失数据的网格单元。 我想将其他两个栅格中的对应单元格也设置为缺少数据。
在一个连续的、传统的循环中,我这样做
myStack.mod <- myStack
start.time <- Sys.time()
for (j in 2:length(names(myStack))) {
for (i in 1:ncell(myStack[[1]])) {
if (is.na(myStack[[1]][i])) {
myStack.mod[[j]][i] <- NA
}
}
}
end.time <- Sys.time() - start.time
end.time
plot(myStack.mod)
为了并行化它,我尝试了以下操作:
cores=detectCores()
cl <- makeCluster(cores[1]-2) #not to overload your computer
registerDoParallel(cl)
myStack.mod <- myStack
start.time <- Sys.time()
foreach (j = 2:length(names(myStack))) %:%
foreach(i = 1:ncell(myStack[[1]])) %dopar% {
if (is.na(myStack[[1]][i])) {
myStack.mod[[j]][i] <- NA
}
}
end.time <- Sys.time() - start.time
end.time
stopCluster(cl)
plot(myStack.mod)
但它不起作用。 有谁知道问题出在哪里? 非常感谢。
您不能从%dopar% { ... }
表达式内部分配值。 相反,就像函数一样,您需要通过显式调用return()
或将要返回的值放在表达式的最后来返回值。
一个例子,
y <- foreach(i = 1:3) %dopar% {
sqrt(i)
}
你想要做的是这样的:
y <- double(3)
foreach(i = 1:3) %dopar% {
y[i] <- sqrt(i)
}
但是,这并不工作,从来就不是工作。 基本上, foreach()
不是 for 循环,它更像是lapply()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.