我想并行运行一些有效的两个输出功能。我完全清楚R函数一次只能返回一个变量。我的问题是在R6类中设置的,我使用parLapply运行一个并行循环调用R6类方法,这些方法更改类实例中的变量以及将值返回到parLapply。但是,对类实例变量所做的任何更改都不是持久的,因为并行循环正在处理我的实例的副本。
我知道实例是在forforks中复制的,它们不能写入相同的实例变量(regressionparameters),因此实例变量根本不会改变。
我的实例变量实际上应该类似于parLapply返回的列表。
library(R6)
library(parallel)
cl=makeForkCluster(2)
setDefaultCluster(cl)
lmclass=R6Class(
public=list(
regressionparameters=NULL,
fit = function(ix) {
lmfit=lm(mpg ~ hp, data = mtcars[ix,])
self$regressionparameters=rbind(self$regressionparameters,data.frame(t(coef(lmfit))))
return(fitted(lmfit))
}))
fitter=R6Class(
public = list(
initialize = function(model,ix) {
private$ix = ix
private$model=model
},
fitallp = function() { #parallel version
parLapply(cl = NULL,private$ix,model$fit)
},
fitalls=function(){ #serial version
lapply(private$ix,model$fit)
}
),
private = list(
model=NULL,
ix = NULL
)
)
model=lmclass$new()
test=fitter$new(model=model,ix=list(1:10,2:11,3:12))
preds=test$fitallp()
print(model$regressionparameters) #this happens as expected
NULL
preds=test$fitalls()
print(model$regressionparameters) #this is what I want
X.Intercept. hp
1 26.57124 -0.05049867
2 26.30332 -0.05038933
3 26.37547 -0.05175793
stopCluster(cl)
在parLapply中返回包含两个输出变量的列表然后合并各个项目并将其分配给模型$ regressionparameter并不是一个真正的解决方案,因为我的fitter可以使用的模型类的类型可以变化并且可以有一个任意数量的输出,可以包含具有自己的回归参数的类似类。