我正在尝试通过hargreaves中的package SPEI方法计算蒸发量,这涉及使用最低温度(TMIN)和
最高温度(TMAX)。考虑到TminTmax rasterstacks具有500,000 cells and 100 layers each,并行计算是我最好的选择。
Hargreaves functionTmin中的Tmaxlatitudeeach grid作为输入。以下是我对此的第一个猜测:

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

#har <- hargreaves(TMIN,TMAX,lat=37.6475) # get evaporation for a station.


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

TminTmax是列表,TminTmax中的每个数据框都附加了一个$latitude。在pet中,k$d是Tmin,k$d是Tmax(也许我应该在pet中提供两个参数,例如function(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)


parLapply仅接受一个参数。如何将TminTmax传递给parLapply
我的宠物功能不正确吗?

谢谢。

最佳答案

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

library(SPEI)
library(parallel)


定义测试列表。

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)))


使集群

clust <- makeCluster(2)


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

pet1 <- function(ind){
  Tmin[[ind]]$a + Tmax[[ind]]$a
}


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

clusterEvalQ(clust, library(SPEI))
clusterExport(clust, ls())


运行parLapply函数

pet_test <- parLapply(clust, 1:length(Tmin), pet1)


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

08-20 00:35