parLapply 多个参数 R

cod*_*123 5 parallel-processing r function raster

我正在尝试通过hargreaves方法计算蒸发量package SPEI。这涉及使用最低温度 ( TMIN) 和最高温度 ( TMAX)。鉴于此Tmin,并行计算是我最好的选择,并且Tmax rasterstacks拥有500,000 cells and 100 layers each. Hargreaves functionTminTmaxlatitudeeach grid作为输入。以下是我的第一个猜测如何解决这个问题:

library(SPEI)
# go parallel 
library(parallel)
clust <- makeCluster(detectCores())

#har <- hargreaves(TMIN,TMAX,lat=37.6475) # get evaporation for a station. 
Run Code Online (Sandbox Code Playgroud)

但是,我的数据是网格化的。

Tmin并且Tmax是名单中,每个数据帧Tmin,并Tmax有一个$latitude连接到它。在 中petk$d是 Tmin,k$d是 Tmax(也许我应该在petegfunction(k,y)而不是仅仅提供两个参数k?)

pet <- function(k) {
  hargreaves(k$d,k$d, k$latitude, na.rm=TRUE)}

# Make library and function available to clust
clusterEvalQ(clust, library(SPEI))
clusterExport(clust, pet)

pet_list <- parLapply(clust, TMIN,TMAX, pet)
Run Code Online (Sandbox Code Playgroud)

parLapply只接受一个参数。我怎样才能通过TminTmaxparLapply?是不是我的宠物功能不对?

谢谢。

Tad*_*las 2

索引可用于引用全局定义的行data.frame。我在下面举一个例子。

library(SPEI)
library(parallel)
Run Code Online (Sandbox Code Playgroud)

定义测试列表。

Tmin <- list(aa = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)),
  bb = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)))

Tmax <- list(aa = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)),
  bb = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)))
Run Code Online (Sandbox Code Playgroud)

制作集群

clust <- makeCluster(2)
Run Code Online (Sandbox Code Playgroud)

这是重写的函数,但我们将在一个更简单的函数上测试它。

pet1 <- function(ind){
  Tmin[[ind]]$a + Tmax[[ind]]$a
}
Run Code Online (Sandbox Code Playgroud)

调用SPEI库并将工作区中的所有内容发送到每个 CPU。这通常不是很好的形式,所以请原谅我。

clusterEvalQ(clust, library(SPEI))
clusterExport(clust, ls())
Run Code Online (Sandbox Code Playgroud)

运行parLapply函数

pet_test <- parLapply(clust, 1:length(Tmin), pet1)
Run Code Online (Sandbox Code Playgroud)

edit:编辑以考虑 Tmin 和 Tmax 列表。核心思想是相同的,即使用索引作为函数的一个参数pet,并从内部引用全局变量pet