R语言使用pracma包fzero函数并行求根找不到函数报错如何解决
报错原因
你使用的PSOCK类型集群的每个工作进程都是独立的全新R会话,默认不会继承主进程加载的依赖包、自定义函数/变量:
- 主进程中加载的
pracma包没有同步到子进程,因此子进程找不到fzero函数 - 你自定义的
root函数也没有同步到子进程,后续也会触发找不到函数的报错
解决方案
在foreach参数中显式声明需要同步到子进程的依赖包和自定义对象即可:
- 用
.packages参数指定并行任务需要加载的包名 - 用
.export参数指定需要导出到子进程的自定义函数/变量名
修改后的完整可运行代码如下:
library(doParallel) library(pracma) n <- 2 root <- function(x) { return(x**2+5*x+6) } result1 = foreach(i=1:n) %do% fzero(root,i) #普通循环 print("Normal Loop completed.") myCluster <- makeCluster(4, type = "PSOCK") registerDoParallel(myCluster) # 新增.packages和.export参数同步依赖到子进程 result2 = foreach(i=1:n, .packages = "pracma", .export = "root") %dopar% fzero(root,i) #并行循环 print("Parallel Loop completed.") stopCluster(myCluster)
如果有多个依赖包,可将.packages的参数值改为字符串向量,比如.packages = c("pracma", "dplyr");如果有多个需要导出的自定义对象,同样将.export改为字符串向量即可。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

