我的数据集是:
ll <- matrix(c(5, 6, 60, 60), ncol=2)
然后我使用库“ sp” 中的函数 spDistsN1 来获取应用的距离矩阵:
apply(ll, 1, function(x) spDistsN1(as.matrix(ll), x, longlat = T))
但是我想通过并行化来做到这一点,
library(parallel)
ncore <- detectCores()
cl <- makeCluster(ncore)
clusterEvalQ(cl = cl, expr = c(library(sp)))
parRapply(cl = cl, x = ll, FUN = function(x) spDistsN1(as.matrix(ll), x,
longlat = T))
它显示以下错误:
checkForRemoteErrors(val)中的错误: 4个节点产生错误;第一个错误:找不到对象“ ll”
我该如何解决?
答案 0 :(得分:4)
使用并发的parApply()
或parRapply()
的一种更容易的选择是使用future.apply包中的future_apply()
(免责声明:我是作者),因为全局变量是自动生成的已导出-无需担心parallel::clusterExport()
等。只需像使用apply()
一样使用它,例如
library(sp)
library(future.apply)
plan(multiprocess) ## parallelize on local machine
ll <- matrix(c(5, 6, 60, 60), ncol = 2)
## Sequentially
y0 <- apply(ll, 1, function(x) A(ll, x, longlat = TRUE))
print(y0)
# [,1] [,2]
# [1,] 0.00000 55.79918
# [2,] 55.79918 0.00000
## In parallel
y1 <- future_apply(ll, 1, function(x) spDistsN1(ll, x, longlat = TRUE))
print(y1)
# [,1] [,2]
# [1,] 0.00000 55.79918
# [2,] 55.79918 0.00000
print(identical(y1, y0))
# [1] TRUE
您可能还会发现博客文章future.apply - Parallelize Any Base R Apply Function很有帮助。
答案 1 :(得分:2)
您需要将所有变量导出到worker。参见?parallel::clusterExport
。