我正在尝试通过hargreaves
中的package SPEI
方法计算蒸发量,这涉及使用最低温度(TMIN
)和
最高温度(TMAX
)。考虑到Tmin
和Tmax
rasterstacks
具有500,000 cells and 100 layers each
,并行计算是我最好的选择。Hargreaves function
将Tmin
中的Tmax
,latitude
和each grid
作为输入。以下是我对此的第一个猜测:
library(SPEI)
# go parallel
library(parallel)
clust <- makeCluster(detectCores())
#har <- hargreaves(TMIN,TMAX,lat=37.6475) # get evaporation for a station.
但是,我的数据是网格化的。
Tmin
和Tmax
是列表,Tmin
和Tmax
中的每个数据框都附加了一个$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
仅接受一个参数。如何将Tmin
和Tmax
传递给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
内部引用全局变量。