Как использовать foreach в функции rxTransform? (вызывается из transformFunc внутри rxDataStep) - PullRequest
0 голосов
/ 04 января 2019

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