这里我有这个功能:(删除对象是我们想要计算的函数的名称)
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;会发生的。最终结果消息警告调用具有错误的函数名称和错误上下文。
答案 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
注意:
func(1:2)
的示例中,这是显示的第二个警告。for
循环优于lapply
或sapply
,但我还没有完成。lapply
优于sapply
,因为函数都返回不同类型的对象。 x
内的无名函数的参数中包含lapply
,并将其作为lapply
的第三个参数。lapply
的第一个参数应该是函数名,因此函数名和函数本身都可用于lapply
内的无名函数。