2017-04-25 1 views
2

Je cherche à calculer l'évaporation par hargreaves procédé dans les package SPEI .Cet consiste à utiliser la température minimale (TMIN) et température maximale (TMAX). Le calcul parallèle est mon meilleur pari étant donné que Tmin et Tmaxrasterstacks ont 500,000 cells and 100 layers each. Hargreaves function prend Tmin, Tmax et latitude à each grid comme entrée. Ce qui suit est ma première supposition comment aller à ce sujet:parLapply multiples arguments R

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

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

Cependant, mes données sont maillées.

Tmin et Tmax sont la liste, chaque trame de données dans Tmin et Tmax a un $latitude attaché. En pet, k$d est Tmin, k$d est Tmax (peut-être que je devrais fournir deux arguments pet par exemple function(k,y) au lieu de simplement 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 accepte un seul argument. Comment puis-je passer Tmin et Tmax à parLapply? Est-ce que ma fonction d'animal de compagnie n'est pas correcte?

Merci.

+0

Vous pouvez également jeter un oeil à 'clusterMap' dans le même paquet. – lmo

Répondre

0

Un index peut être utilisé pour référencer une ligne dans un data.frame défini globalement. Je donne un exemple ci-dessous.

library(SPEI) 
library(parallel) 

Définir la liste de tests.

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

Faire le cluster

clust <- makeCluster(2) 

Ceci est la fonction réécrite, mais nous allons le tester sur une fonction plus simple.

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

Appelez la bibliothèque SPEI et envoyer tout dans l'espace de travail à chaque CPU. Ce n'est normalement pas une grande forme, alors pardonnez-moi.

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

exécuter la fonction parLapply

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

modifier: Sous la direction de tenir compte des listes étant Tmin et Tmax. L'idée principale est la même, à savoir utiliser un index comme argument unique de la fonction pet et référencer une variable globale depuis pet.

+0

merci de fournir une solution rapide. Mes 'tests' sont' lists', Tmin et Tmax. Chaque image contient une valeur de latitude. Pouvez-vous implémenter 'test' sous forme de listes? Merci. – code123

+0

cela vous dérangerait de mettre en œuvre cette approche sur mon problème du monde réel? Je peux vous envoyer des exemples de données via un lien. Je ne pouvais toujours pas le faire fonctionner. Merci – code123