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