foreach的臭虫?完成/合并所有任务后任务中出现错误?

foreach的臭虫?完成/合并所有任务后任务中出现错误?,r,foreach,R,Foreach,我有一个foreach,使用.combine=rbind,有112个任务,一次6个并行操作。启用verbose后,我可以看到所有任务都已完成并合并,但随后我收到消息“task 6 failed—“缺少需要TRUE/FALSE的值” 所以我试着只运行最后12个任务,一切都很好!所以最后12个任务似乎没有任何问题,根据详细的输出,前100个任务组合成功 救命 这将有助于了解您到底在做什么……像这样的事情可能会发生在随机过程、依赖于开始参数的高级拟合方法、中断的输入对象等等。一个traceback()

我有一个foreach,使用.combine=rbind,有112个任务,一次6个并行操作。启用verbose后,我可以看到所有任务都已完成并合并,但随后我收到消息“task 6 failed—“缺少需要TRUE/FALSE的值”

所以我试着只运行最后12个任务,一切都很好!所以最后12个任务似乎没有任何问题,根据详细的输出,前100个任务组合成功

救命


这将有助于了解您到底在做什么……像这样的事情可能会发生在随机过程、依赖于开始参数的高级拟合方法、中断的输入对象等等。一个
traceback()
也会有帮助,尽管
traceback()的输出
在并行任务的情况下可能非常不可读取。但本质上,特定输入和函数的组合出现了问题


至于错误,我希望您注意到result.6从未包含在联合收割机中。因此,我将首先了解task6中到底发生了什么,以及为什么它不返回任何输出。

这是一个非常古老的问题,但是,我在R中的
foreach
遇到类似问题后发现了它。这可能对其他人有所帮助


我看不到原始代码,但我发现当我将
parallel::makeCluster()
中的内核数从24个减少到16个时,出现了错误“task XX failed”“不可复制。我已经有好几年没有花时间研究并行代码了,但我猜一个节点要么没有分配任务,要么没有返回任务。

这将有助于了解您到底在做什么。。。这样的事情可能发生在随机过程、依赖于起始参数的高级拟合方法、中断的输入对象等情况下。回溯()也会有所帮助。至于error方法,我希望您注意到result.6从未包含在combine中…@Joris-我正在遍历数据帧中的列,并计算一组统计数据(如%缺失、标准偏差等)。这是我第一次听到关于traceback()的消息,所以我会深入挖掘。我没有注意到结果!抢手货我将不得不孤立于此(我错误地认为foreach在遇到错误时会停止)@Joris-我的功能有问题,导致任务6失败…你能发表你的评论作为答案,这样我就可以接受并信任你吗?再次感谢您捕捉到这一点,我真的需要第二组眼睛。虽然它本身并不能解决这一问题,但我发现,如果没有在出错时中止循环,特别是在需要很长时间才能完成的情况下,调试会轻松得多。对我来说,包含
.errorhandling
标志很有用,例如
foreach(.errorhandling=“pass”)
。如果需要很长时间才能完成操作,我会这样做-我想单独修复异常,而且修复起来可能更容易、更快,只要在结果的后处理中内置了错误检查。此外,正如Joris所建议的,示例代码将非常有用。@Iterator-了解.errorhandling很好!“停止”的文档应该提到,该选项不会在出现错误时立即终止。如果能选择立即停止,那就太好了。我喜欢在bug发生时修复它们,而不必担心后期处理结果。更大的问题(IMHO)不是foreach何时停止。除非我错过了一个选择?foreach似乎没有捕获stacktrace或任何可用于隔离bug的上下文。我必须连续运行我的函数来确定引起错误的代码行。与
traceback()
一样,另一个有用的调试工具是设置
选项(error=recover)
。这允许您浏览变量,从调用错误的函数中可以看到。
numValues: 112, numResults: 0, stopped: TRUE
automatically exporting the following variables from the local environment:
  data, dependentVariables, groupByVariable, numberOfBinsForMissingValueHistogram, outputDirectory 
got results for task 1
numValues: 112, numResults: 1, stopped: TRUE
returning status FALSE
...
got results for task 100
numValues: 112, numResults: 100, stopped: TRUE
first call to combine function
evaluating call object to combine results:
  fun(result.1, result.2, result.3, result.4, result.5, result.7, 
    result.8, result.9, result.10, result.11, result.12, result.13, 
    result.14, result.15, result.16, result.17, result.18, result.19, 
    result.20, result.21, result.22, result.23, result.24, result.25, 
    result.26, result.27, result.28, result.29, result.30, result.31, 
    result.32, result.33, result.34, result.35, result.36, result.37, 
    result.38, result.39, result.40, result.41, result.42, result.43, 
    result.44, result.45, result.46, result.47, result.48, result.49, 
    result.50, result.51, result.52, result.53, result.54, result.55, 
    result.56, result.57, result.59, result.60, result.61, result.62, 
    result.63, result.64, result.65, result.66, result.67, result.68, 
    result.69, result.70, result.71, result.72, result.73, result.74, 
    result.75, result.76, result.77, result.78, result.79, result.80, 
    result.81, result.82, result.83, result.84, result.85, result.86, 
    result.87, result.88, result.89, result.90, result.91, result.92, 
    result.93, result.94, result.95, result.96, result.97, result.98, 
    result.99, result.100)
returning status FALSE
got results for task 101
numValues: 112, numResults: 101, stopped: TRUE
...
got results for task 112
numValues: 112, numResults: 112, stopped: TRUE
calling combine function
evaluating call object to combine results:
  fun(accum, result.101, result.102, result.103, result.104, result.105, 
    result.106, result.107, result.108, result.109, result.110, 
    result.111, result.112)
returning status TRUE
Error in { : task 6 failed - "missing value where TRUE/FALSE needed"