关于使用R6类和foreach()%dopar%的问题

时间:2018-03-22 18:07:10

标签: r parallel-processing doparallel parallel-foreach r6

当与foreach()一起使用时,我在R6类上遇到问题,可能与环境有关(我正在使用Windows)。

假设有两个R6类,“class1”和“class2”。 class1中的method1依赖于class2(例如,参见下面的示例代码)。 问题是,如果我在class1上使用foreach() %dopar%,则R似乎无法识别class2,即使我在.export = c("class1", "class2")语句中明确设置了foreach()。 (这里class1使用class2) 但是,如果我在class2上使用foreach(),它可以正常工作......(这里我只使用foreach()中的class2)

所以问题似乎是,如果class2在class1中“嵌套”,那么class2将无法与foreach()一起使用。我觉得这与环境有关,但无法弄清楚如何。我甚至试过.export = ls(.GlobalEnv),但它仍然不起作用......

我可以通过实例化class2中的对象并将其用作method1中的额外参数来解决这个问题,例如定义class1时method1 = function(input = 1:3, objectFromClass2),但从长远来看它可能不是最佳解决方案 - 特别是考虑代码可维护性和调试的简易性(这也是我使用R6的OO功能的原因)。

非常感谢提前!

以下是代码示例:

cl = makeCluster(3)
registerDoParallel(cl)

class1 = R6Class(
  "class1", 
  public = list(
    method1 = function(input = 1:3){
      y = class2$new()
      output = y$method2(input)
      return (output * 3)
    }
  )
)


class2 = R6Class(
  "class2", 
  public = list( 
    method2 = function(input) {
      return (input + 1)
    }
  )
)

# This doesn’t work. 
# Error in { : task 1 failed - "object 'class2' not found"
foreach(input = 1:3, .packages = "R6", .export = c("class1", "class2")) %dopar% {
  y = class1$new()
  z = y$method1(input)
  return (z)
}

# This works
foreach(input = 1:3, .packages = "R6", .export = c("class1", "class2")) %dopar% {
  y = class2$new()
  z = y$method2(input)
  return (z)
}

# Class1 also works fine if it’s called outside of foreach()
y = class1$new()
z = y$method1(1:3)

0 个答案:

没有答案