0

我想并行运行一些有效地具有两个输出的功能。我完全知道 R 函数一次只能返回一个变量。我的问题设置在 R6 类中,我使用 parLapply 调用 R6 类方法运行并行循环,这些方法更改类实例中的变量并将值返回给 parLapply。但是,对类实例变量所做的任何更改都不是持久的,因为并行循环正在处理我的实例的副本。

我知道实例是跨叉复制的,它们不能写入同一个实例变量(回归参数),因此实例变量根本不会改变。

我的实例变量实际上应该类似于 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 中返回一个包含两个输出变量的列表,然后合并各个项目并将其分配给 model$regressionparameter 并不是真正的解决方案,因为我的装配工可以使用的模型类的类型可能会有所不同,并且可能有任意数量的输出并且可以包含具有自己的回归参数的类似类。

4

0 回答 0