如何跳过循环中的错误

我想跳过一个循环中的错误(如果有的话),并继续下一个迭代。我想用{0,1,2}随机抽取的元素来计算2×2矩阵的100个逆矩阵。可以具有单个矩阵(例如,

1 0
2 0

这是我的代码

set.seed(1)
count <- 1
inverses <- vector(mode = "list", 100)
repeat {
    x <- matrix(sample(0:2, 4, replace = T), 2, 2)
    inverses[[count]] <- solve(x)
    count <- count + 1
    if (count > 100) break
}

在第三次迭代中,矩阵是奇异的,代码停止运行,并显示错误消息。在实践中,我想绕过这个错误,继续下一个循环。我知道我需要使用try或tryCatch函数,但我不知道如何使用它们。这里也提到了类似的问题,但它们都非常复杂,答案远远超出了我的理解。如果有人可以给我一个完整的代码专门针对这个问题,我真的很感激。

这将使NULL成为单数矩阵的倒数:

inverses[[count]] <- tryCatch(solve(x), error=function(e) NULL)

如果对tryCatch的调用中的第一个表达式引发错误,它将执行并返回提供给其错误参数的函数的值。提供给错误参数的函数必须将错误本身作为参数(这里我称之为e),但是您不需要做任何事情。

然后,您可以使用反转[! is.null(inverses)]。

或者,您可以使用较低级别的尝试。选择真的是一个味道的问题。

count <- 0
repeat {
    if (count == 100) break
    count <- count + 1
    x <- matrix(sample(0:2, 4, replace = T), 2, 2)
    x.inv <- try(solve(x), silent=TRUE)
    if ('try-error' %in% class(x.inv)) next
    else inverses[[count]] <- x.inv
}

如果您的表达式生成错误,请尝试返回具有类try-error的对象。如果silent = FALSE,它将打印消息到屏幕。在这种情况下,如果x.inv具有类try-error,那么我们再次调用next来停止执行当前的迭代并移动到下一个迭代,否则我们将x.inv添加到inverses中。

编辑:

您可以避免重复使用重复循环。

matrices <- replicate(100, matrix(sample(0:2, 4, replace=T), 2, 2), simplify=FALSE)
inverses <- lapply(matrices, function(mat) if (det(mat) != 0) solve(mat))

有趣的是,复制的第二个参数被视为一个表达式,这意味着它会为每个复制重新执行。这意味着您可以使用replicate来创建从同一表达式生成的任意数量的随机对象的列表。

http://stackoverflow.com/questions/14059657/how-to-skip-an-error-in-a-loop

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何跳过循环中的错误