正确处理嵌套函数

时间:2018-09-05 08:22:54

标签: r function debugging purrr

我有一个函数superFoo(),该函数调用其他函数foo()。每个foo()函数都有不同的输出,即列表,数据帧,标量。 我需要:

  1. 只要任何superFoo()失败(表示错误或警告),就停止执行foo()
  2. 捕获错误消息。

    foo = function(a){
        log(a)
    }
    
    superFoo = function (a){
        varA = foo(a)
    
        # IF foo(a) fails, superFoo has to: stop and     return NA
    
        varB = foo(varA+3)
        varA + varB
    }
    
    # Iteration
    HyperY = setups %>% split(.$IDsample) %>% 
        map(superFoo)
    

我知道我可以在tryCatch()内进行superFoo(),捕获错误消息并在superFoo()中返回NA。像这样:

varA = tryCatch({foo()}, error=(return(NULL)), warning(return(NULL)))
if (is.null(varA)) { return(list(NA, errorMessage)}

问题是我在foo()中有9个函数superFoo()。我想知道是否有更有效的编程方法。

另一种替代方法是purrr:safely()。但是,这是个tryCatch()的词,因为在调用它之前我必须在foo()中重新声明superFoo()

safeFoo = safely(foo)
varA = safeFoo(a)
if (is.null(varA)) { return(list(NA, errorMessage) }

嵌套函数中错误处理的良好实践是什么?

1 个答案:

答案 0 :(得分:0)

如果您对9个函数调用的响应相同,则可以将superFoo的整个内容包装在一个tryCatch中,例如

superFoo = function (a){
  tryCatch({
    varA = foo(a)

    # IF foo(a) fails, superFoo has to: stop and     return NA

    varB = foo(varA+3)
    varA + varB
  }, error = return(NULL), warning = return(NULL))
}

这会跳过对is.null(varA)的单独检查。如果需要,请添加

if (is.null(varA)) stop("varA is NULL")

,与捕获的其他错误相同。