Я пытаюсь сделать так, чтобы долго выполняющаяся функция rxTransform выполняла цикл быстрее, используя функцию% dopar% в пределах foreach.
Ниже приведен простой тестовый пример. Я хочу взять динамическое количество столбцов и запустить log10 для каждой строки / столбца. (Это не мой реальный вариант использования; это просто простой пример для иллюстрации.)
Приведенный ниже код работает нормально, если я использую оператор for в функции logxform. Если я закомментирую строку с оператором for и раскомментирую вышеприведенную строку, которая использует foreach (с% do%, даже не% dopar%), он выполняется с ошибками.
Я попытался передать foreach и его зависимости как часть transformPackages в вызове rxDataStep. Я попытался использовать doRSR вместо библиотеки foreach ... не заставить ее работать.
В конечном счете, я бы хотел использовать foreach с% dopar% в функции rxTransform. Любой совет будет оценен.
library(foreach)
startSize <- 10
endSize <- 20
vars <- foreach(i = startSize:endSize, .combine = "cbind") %do% rnorm(10, i)
data_in <- data.frame(vars)
tempInput <- tempfile(fileext = ".xdf")
tempOutput <- tempfile(fileext = ".xdf")
rxImport(inData = data_in, outFile = tempInput, overwrite = T)
logxform <- function(dataList) {
numRowsInChunk <- .rxNumRows
#foreach (j = 1:columnDepth) %do% {
for (j in 1:columnDepth) {
dataList[[paste0("log_R",j)]] <- rep(0, times=numRowsInChunk)
for (i in 1:numRowsInChunk) {
dataList[[paste0("log_R",j)]][i] <- log10(dataList[[paste0("result.",j)]][i])
}
}
return(dataList)
}
rxDataStep(inData = tempInput, outFile = tempOutput, overwrite = T,
transformObjects = list(columnDepth = endSize - startSize + 1),
transformPackages = c("codetools","iterators","foreach"),
transformFunc = logxform)