2

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

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

所以问题似乎是,如果 class2 “嵌套”在 class1 中,那么 class2 将无法与foreach(). 我觉得这与环境有关,但无法弄清楚如何。我什至试过.export = ls(.GlobalEnv)了,但还是不行……</p>

我可以通过从 class2 实例化一个对象并将其用作方法 1 中的额外参数来解决此问题,例如method1 = function(input = 1:3, objectFromClass2)在定义 class1 时,但从长远来看它可能不是最佳解决方案 - 特别是考虑到代码可维护性和易于调试作为优先事项(这就是我使用 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)
4

0 回答 0