Экспорт объектов в глобальной и функциональной среде в кластер

Я использую foreach и doParallel в приведенном ниже примере кода.

library(foreach)
  library(doParallel)
  clusters =  makeCluster(4)
  registerDoParallel(clusters)


  fun1 <- function(param1, param2, param3)
  {
     param4 = param1+param2
     param5 = param2+param3
     param6 = param3+param1
     print(ls(envir = environment()))
     print(ls(envir = .GlobalEnv))
     # clusterExport(cl = clusters, varlist = ls(), envir = environment())
     clusterExport(cl = clusters, varlist = ls(), envir = .GlobalEnv)
     mmm = foreach(i = 1:length(param1), .combine = rbind) %dopar% fun2(i, param4, param5, param6)
     print(mmm)
  }

  fun2 <- function(i, param4, param5, param6)
  {
  j = param4[i] * param5[i] * param6[i]
  }

  param1 = 1:10
  param2 = 2:11
  param3 = 3:12
  fun1(param1, param2, param3)

В аргументе envir clusterExport, когда я использую envir = .GlobalEnv, я получаю сообщение об ошибке

**"Error in get(name, envir = envir) : object 'param4' not found"**.

И когда я использую envir = environment (), ошибка

**"Error in fun2(i, param4, param5, param6) : task 1 failed - "could not find function "fun2"""**

Мой вопрос в том, как я могу экспортировать все объекты как в глобальной, так и в функциональной среде в кластер.


person Sim101011    schedule 26.12.2016    source источник


Ответы (1)


Когда вы находитесь в функции, вам не нужно вручную экспортировать нужные вам объекты. Но вы должны передать fun2 в fun1, если хотите, чтобы к нему имел доступ foreach в fun1. Итак, просто сделайте:

fun1 <- function(param1, param2, param3, fun2)
{
  param4 = param1+param2
  param5 = param2+param3
  param6 = param3+param1
  mmm = foreach(i = 1:length(param1), .combine = rbind) %dopar% {
    fun2(i, param4, param5, param6)
  } 
  print(mmm)
}

fun1(param1, param2, param3, fun2)
person F. Privé    schedule 13.07.2017