gpt4 book ai didi

r - 从大 `sapply` 中的错误中解脱出来

转载 作者:行者123 更新时间:2023-12-04 02:19:13 25 4
gpt4 key购买 nike

这个问题可能会或可能不会受到我失去整个 3 小时地理编码运行的启发,因为其中一个值返回了错误。提示可惜(向下)投票。

基本上,在 sapply 调用的函数中返回了一个错误。 .我有 options(error=recover)上,但是尽管浏览了我可以使用的每个级别,我还是找不到任何地方可以将(数千次成功)调用 FUN 的结果存储在内存中。

我在浏览时发现的一些对象在我试图检查它们时出错,声称引用不再有效。不幸的是,我丢失了特定的错误消息。

这是一个快速示例,虽然它没有复制引用错误(我怀疑这与消失的环境有关并且可能无关紧要),但确实表明我看不到保存已处理数据的方法。

有这样的技术吗?

请注意,我已经意识到我的错误,并通过 try 插入了比以前更强大的错误处理。 ,但我正在寻找一种方法来恢复内容 事后而不是事前。

测试功能

sapply( seq(10), function(x) {
if(x==5) stop("Error!")
return( "important data" )
} )

互动探索
> sapply( seq(10), function(x) {
+ if(x==5) stop("Error!")
+ return( "important data" )
+ } )
Error in FUN(1:10[[5L]], ...) : Error!

Enter a frame number, or 0 to exit

1: sapply(seq(10), function(x) {
if (x == 5)
stop("Error!")
return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 3
Called from: FUN(1:10[[5L]], ...)
Browse[1]> ls()
[1] "x"
Browse[1]> x
[1] 5
Browse[1]>
Enter a frame number, or 0 to exit

1: sapply(seq(10), function(x) {
if (x == 5)
stop("Error!")
return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 2
Called from: lapply(X = X, FUN = FUN, ...)
Browse[1]> ls()
[1] "FUN" "X"
Browse[1]> X
[1] 1 2 3 4 5 6 7 8 9 10
Browse[1]> FUN
function(x) {
if(x==5) stop("Error!")
return( "important data" )
}
Browse[1]>
Enter a frame number, or 0 to exit

1: sapply(seq(10), function(x) {
if (x == 5)
stop("Error!")
return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 1
Called from: sapply(seq(10), function(x) {
if (x == 5)
stop("Error!")
return("important data")
})
Browse[1]> ls()
[1] "FUN" "simplify" "USE.NAMES" "X"
Browse[1]> X
[1] 1 2 3 4 5 6 7 8 9 10
Browse[1]> USE.NAMES
[1] TRUE
Browse[1]> simplify
[1] TRUE
Browse[1]> FUN
function(x) {
if(x==5) stop("Error!")
return( "important data" )
}
Browser[1]> Q

需要明确的是,我希望找到的是向量:
[1] "important data" "important data" "important data" "important data"

也就是说,到此为止的内部循环的结果。

编辑:使用 C 代码更新

.Internal(lapply())following code :
PROTECT(ans = allocVector(VECSXP, n));
...
for(i = 0; i < n; i++) {
...
tmp = eval(R_fcall, rho);
...
SET_VECTOR_ELT(ans, i, tmp);
}

我要到 ans任何调用 lapply 时失败。

最佳答案

我很难理解为什么会出现 try()这不是要走的路吗?如果sapply()无论出于何种原因失败,那么你

  • 想很好地处理那个失败
  • 从那里继续

  • 为什么您希望整个数据分析/处理步骤仅因出现错误而停止?这就是你的提议。与其尝试恢复已经完成的工作,不如编写您的代码,让它继续运行,记录发生的错误,同时优雅地进入流程的下一步。

    这有点令人费解,因为你给出的例子是人为的(如果你知道什么会导致错误,你可以在没有 try() 的情况下处理它),但请耐心等待:
    foo <- function(x) {
    res <- try({
    if(x==5) {
    stop("Error!")
    } else {
    "important data"
    }
    })
    if(inherits(res, "try-error"))
    res <- "error occurred"
    res
    }

    > sapply( seq(10), foo)
    Error in try({ : Error!
    [1] "important data" "important data" "important data" "important data"
    [5] "error occurred" "important data" "important data" "important data"
    [9] "important data" "important data"

    在后台运行需要数周才能在我的工作站上完成的作业后,我很快学会了编写大量 try()围绕单个语句而不是大块代码调用,这样一旦发生错误,我就可以快速退出该迭代/步骤,而对正在运行的作业的影响最小;换句话说,如果某个特定的 R 调用失败,我会返回一些会插入 sapply() 返回的对象中的东西。 (或任何功能)很好。

    对于更复杂的事情,我可能会使用 lapply() :
    foo2 <- function(x) {
    res <- try({
    if(x==5) {
    stop("Error!")
    } else {
    lm(rnorm(10) ~ runif(10))
    }
    })
    if(inherits(res, "try-error"))
    res <- "error occurred"
    res
    }

    out <- lapply(seq(10), foo2)
    str(out, max = 1)

    因为您将需要列表而不是尝试将更复杂的对象简化为简单的对象:
    >     out <- lapply(seq(10), foo2)
    Error in try({ : Error!
    > str(out, max = 1)
    List of 10
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ : chr "error occurred"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"
    $ :List of 12
    ..- attr(*, "class")= chr "lm"

    也就是说,我可能会通过 for() 完成此操作。循环,在我迭代时填充一个预先分配的列表。

    关于r - 从大 `sapply` 中的错误中解脱出来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13003834/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com