问题

在一个函数中,当你对一个表达式求值不止一次时,你会得到警告restarting interrupted promise evaluation.例如:

foo <- function() stop("Foo error")
bar <- function(x) {
    try(x)
    x
}
bar(foo())

yields

Error in foo() : Foo error
Error in foo() : Foo error
In addition: Warning message:
In bar(foo()) : restarting interrupted promise evaluation

如何避免这种警告并妥善处理?

出身背景

尤其是在执行诸如写入数据库之类的操作时,您可能会遇到需要重试几次操作的锁定错误.因此,我创建了一个大约tryCatch次的包装器,对表达式进行最多n次重新求值,直到成功:

tryAgain <- function(expr, n = 3) {
    success <- T
    for (i in 1:n) {
        res <- tryCatch(expr,
            error = function(e) {
                print(sprintf("Log error to file: %s", conditionMessage(e)))
                success <<- F
                e
            }
        )
        if (success) break
    }
    res
}

然而,我收到了restarting interrupted promise evaluation条信息:

>   tryAgain(foo())
[1] "Log error to file: Foo error"
[1] "Log error to file: Foo error"
[1] "Log error to file: Foo error"
<simpleError in foo(): Foo error>
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
  restarting interrupted promise evaluation
2: In doTryCatch(return(expr), name, parentenv, handler) :
  restarting interrupted promise evaluation

理想情况下,我希望完全避免这些信息,而不仅仅是掩盖它们,因为我可能还希望处理来自expr个用户的真正警告.

推荐答案

如果希望每个错误消息都显示出来,也可以不使用silent=TRUE.在这两种情况下,你都不会得到关于promise 的信息:

foo <- function() stop("Foo error")
bar <- function(x) {
    try(eval.parent(substitute(x)), silent = TRUE)
    x
}
bar(foo())

R相关问答推荐

R:如何自动化变量创建过程,其中我需要基于ifelse()为现有变量的每个级别创建一个单独的变量

使用预定值列表将模拟数量(n)替换为rnorm()

过滤矩阵以获得R中的唯一组合

使用sensemakr和fixest feols模型(R)

删除facet_wrap标签之间的水平线

使用对管道内单元格的引用生成新变量

根据选中三个复选框中的一个或两个来调整绘图

在R中将特定列的值向右移动

如何优化向量的以下条件赋值?

将数字转换为分钟和秒

使用整齐的计算(curl -curl )和杂音

从外部文件读取多个值作为字符向量

仅 Select 超过9行的CSV文件

根据列表中项目的名称合并数据框和列表

如何对r中包含特定(未知)文本的行求和?

将摘要图添加到facet_WRAP gglot的末尾

R中时间间隔的大向量与参考时间间隔的相交

多元正态分布的计算

数值型数据与字符混合时如何进行绑定

基于R中的辅助向量中的值有条件地连接向量中的字符串