在 R 中使用 doParallel 时,如何获取引发错误的行号?

Posted

技术标签:

【中文标题】在 R 中使用 doParallel 时,如何获取引发错误的行号?【英文标题】:When using doParallel in R, how can I get the line number where an error was thrown? 【发布时间】:2014-09-05 01:07:29 【问题描述】:

我试图弄清楚在使用 foreach 和 doParallel 时如何查明引发错误的行。这是一个例子:

foreach.example <- function() 

    require("doParallel")
    z <- foreach (i = 1:2) %do% 
    
       x <- i + 'a'
    
    return(z)

所以在 %do% 中有一个错误,我将一个字符添加到一个数字中。 (我在这里所说的一切也适用于 %dopar%,)。当我运行它时,我得到:

> foreach.example()
Error in  (from test_foreach.R#3) : task 1 failed - "non-numeric argument     to binary operator"

我无法从这个判断我在循环中的哪个位置出现错误,第 3 行是 foreach 行,而不是有问题的行。当我运行 debugger() 我得到:

> debugger()
Message:  Error in  (from test_foreach.R#3) : task 1 failed - "non-numeric    argument to binary operator"
    Available environments had calls:
1: foreach.example()
2: test_foreach.R#3: foreach(i = 1:2) %do% 
x <- i + "a"

3: e$fun(obj, substitute(ex), parent.frame(), e$data)
4: stop(simpleError(msg, call = expr))

请注意,第 2 帧通常会指示整个循环,因此我找不到实际引发错误的行。

如果我在没有 foreach 的情况下运行它,我会得到有用的信息:

regular.example <- function() 
 
    z <- list()
    for (i in 1:2) 
        x <- i + 'a'
        z <- c(z, list(x))
    
    return(z)


>regular.example()
Error in i + "a" (from test_foreach.R#12) : non-numeric argument to binary operator

然后调试器将我带到引发异常的代码行。

关于使用 foreach 时如何用异常识别行号有什么想法吗?谢谢。

【问题讨论】:

您可以使用 doMPI 后端获取工作人员回溯,但这不包括行号。并且回溯只显示在工作日志文件中,而不显示在主服务器产生的错误消息中。使用 %do% 时我想不出任何选项。 【参考方案1】:

尝试修改您的 foreach 调用以包含 .verbose = TRUE

z <- foreach (i = 1:2, .verbose = T) %do% ...

【讨论】:

以上是关于在 R 中使用 doParallel 时,如何获取引发错误的行号?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 doParallel 的 foreach 时,Windows Defender 的 CPU 使用率非常高

如何使用 doParallel 计算 R 中邮政编码之间的距离?

R:在doParallel /降雪中制作集群挂起

使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环

Foreach和doparallel而不是R中的for循环

在 R 中将 fread 与 foreach 和 doParallel 一起使用