使用plyr的ldply并行化时,如何引入terra等依赖库?
解决方案
问题出在plyr的ldply不支持.packages参数,且PSOCK集群的每个并行节点是独立的R进程,不会自动继承主进程加载的包,导致节点找不到terra等依赖库的函数。
解决步骤如下:
创建集群后,显式在每个节点加载所需依赖包
使用clusterEvalQ命令,让所有集群节点同步加载terra、sf(以及你用到的sp):cl <- makePSOCKcluster(3) # 在每个集群节点加载依赖包 clusterEvalQ(cl, { library(terra) library(sf) library(sp) # 如果你的函数依赖sp,加上这行 }) registerDoParallel(cl)正常执行
ldply并行任务
此时无需传递.packages参数,直接运行原有代码即可:polygons <- 1:100 paddf <- ldply(polygons, .fun = rasterize_polygons, polysf = polysf, pgdf = pgdf, .parallel = TRUE) stopCluster(cl)
补充说明
PSOCK集群的每个节点都是独立的R会话,主进程中加载的包、定义的对象不会自动同步到节点。除了加载包,如果你自定义函数rasterize_polygons依赖主进程中的其他自定义对象,还需要用clusterExport(cl, c("对象1", "对象2"))将这些对象同步到所有节点。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

