Параллельная обработка R с несколькими выходами в настройках класса R6 - PullRequest
0 голосов
/ 25 мая 2018

Я хочу запустить некоторую функцию параллельно, которая фактически имеет два выхода.Я полностью осознаю, что функция R может возвращать только одну переменную за раз.Моя проблема установлена ​​в классе R6, где я запускаю параллельный цикл, используя parLapply, вызывая методы класса R6, которые изменяют переменную внутри экземпляра класса, а также возвращая значения parLapply.Однако любое изменение, внесенное в переменные экземпляра класса, не является постоянным, потому что параллельный цикл работает с копиями моего экземпляра.

Я понимаю, что экземпляры копируются на вилки и не могут записывать в одну и ту же переменную экземпляра (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 на самом деле не является решением как требование, так как типы классов моделей, которые может использовать мой сборщик, могут варьироваться и могут иметь произвольное количество выходов и могут содержать аналогичные классы со своимисобственные параметры регрессии.

...