当与 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)