【问题标题】:When using doParallel in R, how can I get the line number where an error was thrown?在 R 中使用 doParallel 时,如何获取引发错误的行号?
【发布时间】: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% 时我想不出任何选项。

标签: r parallel-processing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2013-06-13
    相关资源
    最近更新 更多