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