gpt4 book ai didi

r - parLapply 多个参数 R

转载 作者:行者123 更新时间:2023-12-02 05:03:01 24 4
gpt4 key购买 nike

我正在尝试通过 hargreaves 计算蒸发量package SPEI 中的方法.这涉及使用最低温度( TMIN )和最高温度 ( TMAX )。鉴于Tmin,并行计算是我最好的选择和Tmax rasterstacks500,000 cells and 100 layers eachHargreaves function需要Tmin , Tmaxlatitudeeach grid作为输入。以下是我的第一个猜测:

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

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

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

TminTmax是列表,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仅接受一个参数。怎么才能通过TminTmaxparLapply ?难道是我的宠物功能不正确?

谢谢。

最佳答案

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

关于r - parLapply 多个参数 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43599919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com