2017-04-25 187 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