2017-04-25 188 views
2

我试图通过hargreaves方法来计算蒸发内package SPEI。这包括使用最小温度(TMIN)和 上限温度(TMAX)。并行计算是我最好的选择,因为TminTmaxrasterstacks500,000 cells and 100 layers eachHargreaves functionTmin,Tmaxlatitudeeach grid作为输入。以下是我的第一个猜测如何去了解这一点:parLapply多个参数ř

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

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

然而,我的数据网格化。

TminTmax和是列表中,在TminTmax和每个数据帧具有附加给它的$latitude。在petk$d是三甲基铟,k$d的最高温度(也许我应该提供两个参数在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只接受一个参数。我如何通过TminTmaxparLapply? 是否我的宠物功能不正确?

谢谢。

+0

你也可以看看'clusterMap'在同一个包中。 – lmo

回答

0

索引可用于引用全局定义的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内的全局变量。

+0

感谢您提供及时的解决方案。我的'test'是'lists',Tmin和Tmax。其中的每个数据帧都有一个纬度值。你可以将'test'作为列表来实现吗?谢谢。 – code123

+0

你会介意在我的现实世界问题上实施这种方法吗?我可以通过链接向您发送一些示例数据。我仍然无法运行。谢谢 – code123