R中foreach %dopar%调用R6类跨平台报错的解决方案咨询
解决Windows下R6类结合doParallel的全局变量找不到问题
Windows下运行代码时出现object 'a1' not found错误,核心原因是Windows采用socket机制创建并行子进程,不会自动继承父进程的全局环境变量;而Linux的fork机制会完整复制父进程环境,因此代码在Linux下可正常运行。以下是两种保留全局变量使用的解决方案:
方案一:通过foreach的.export参数显式传递全局变量
在foreach调用中添加.export = "a1",明确告知并行框架将全局变量a1传递给子进程:
library(R6) library(doParallel) registerDoParallel(cores = 4) a1 <- 2 C1 <- R6Class( public = list( f1 = function(x) { x * a1 } ), ) myC1 <- C1$new() res <- foreach(j = 1:2, .combine = sum, .export = "a1") %dopar% { myC1$f1(j) } print(res)
方案二:将全局变量绑定到R6类内部环境
通过R6类的私有成员存储全局变量,让方法调用不再依赖全局环境,同时保留全局变量的初始化传入:
library(R6) library(doParallel) registerDoParallel(cores = 4) a1 <- 2 C1 <- R6Class( public = list( initialize = function(val) { private$a_val <- val }, f1 = function(x) { x * private$a_val } ), private = list( a_val = NULL ) ) myC1 <- C1$new(a1) res <- foreach(j = 1:2, .combine = sum) %dopar% { myC1$f1(j) } print(res)
两种方案均能解决Windows下的报错问题:方案一适合快速修改现有代码,方案二更符合面向对象的封装设计,降低对全局环境的依赖。
内容的提问来源于stack exchange,提问作者sunheng
相关产品推荐
相关产品推荐

