使用trycatch返回错误的上下文

时间:2017-05-18 14:22:12

标签: r function try-catch

这里我有这个功能:(删除对象是我们想要计算的函数的名称)

    func <- function(x, remove=NULL) {
  if(class(x)%in%"igraph"){
  doclist <- list("edgelist"=function(x) as.edgelist(x),
                    "adjacencyMatrix"=function(x)as_adjacency_matrix(x),
                    "incidenceMatrix"=function(x) as_incidence_matrix(x, 0.001),
                    "data.frame"=function(x) as_data_frame(x))

  sapply(doclist[setdiff(names(doclist), remove)], function(f) f(n))}
  else stop("The input is not an igraph object")
}

如何在此功能中使用tryCatch?如果&#39; doclist&#39;中有任何功能。面对一个错误,下一行的博客列表&#39;会发生的。最终结果消息警告调用具有错误的函数名称和错误上下文。

1 个答案:

答案 0 :(得分:1)

以下是一些代码,基本显示了如何执行此操作。它不会在igraph中使用doclist个对象或您的函数,因此您必须自行调整它以使用它们。

首先,这里有两个引发错误的函数:

g <- function(y) { 
    stop("g failed")
}
h <- function(y) { 
    stop("h failed")
}

这是您的功能的清理版本,使用doclist中的一些不同功能:

func <- function(x, remove=NULL) {
    if (!is(x, "numeric")) 
        stop("x must be a numeric")

    doclist <- list(
        sum = function(x) sum(x),
        g = function(x) g(x),
        makeMatrix = function(x) matrix(x, nrow=3, ncol=3),
        h = function(x) h(x)
    )
    doclist <- doclist[setdiff(names(doclist), remove)]

    warningsText <- ""
    result <- lapply(names(doclist), 
        function(functionName, x) {
            f <- doclist[[functionName]]
            tryCatch(f(x), 
                error = function(e) {
                    warningsText <<- paste0(warningsText, 
                        "\nError in ", functionName, ":\n", e$message)
                    return(NULL)
                }) 
        }, x)

    if (nchar(warningsText) > 0) 
        warning(warningsText)
    return(result)
}

这就是它产生的东西:

> func(1:2)
[[1]]
[1] 3

[[2]]
NULL

[[3]]
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    2    1    2
[3,]    1    2    1

[[4]]
NULL

Warning messages:
1: In matrix(x, nrow = 3, ncol = 3) :
  data length [2] is not a sub-multiple or multiple of the number of rows [3]
2: In func(1:2) : 
Error in g:
g failed
Error in h:
h failed

注意:

  • 对于引发错误的函数,这会在结果列表中添加NULL。
  • 所有错误都会被置于一个警告中。在func(1:2)的示例中,这是显示的第二个警告。
  • for循环优于lapplysapply,但我还没有完成。
  • lapply优于sapply,因为函数都返回不同类型的对象。
  • 最好在x内的无名函数的参数中包含lapply,并将其作为lapply的第三个参数。
  • lapply的第一个参数应该是函数名,因此函数名和函数本身都可用于lapply内的无名函数。