我正在尝试改进我的递归函数的日志,该函数在页面中拆分向量输入并为每个页面调用自己来做事。
为此,我想使用plyr包提供的progress_bar包装器。这是一个可重复的例子:
ric <- function(v, .progress = create_progress_bar("text")){
f <- rep(seq_len(ceiling(length(v) / 10)), each = 10,length.out = length(v))
chunks <- split(v, f = f)
if(length(chunks) > 1){
.progress$init(length(v))
do.call(cbind,
lapply(chunks, function(single.chunk) {
ric(v = single.chunk, .progress = .progress)
})
)
} else {
lapply(v, function(item) {
tryCatch(.progress$step(), error = .progress$init(length(v)))
#.progress$step()
return(item)
})
}
}
a <- ric(v = seq(1:1340))
这个想法是,如果step()函数失败,则意味着我们处于single.chunk执行的第一次迭代中,所以我需要首先使用init()条。
但由于某种原因,tryCatch似乎总是失败并且init()即使它应该已经设置了吧。我完全不知道......
PS我知道单个和多个块的输出是不同的,但是对于示例的目的并不重要
答案 0 :(得分:1)
我没有试图弄乱你的代码,但是一个问题几乎肯定是error
参数到tryCatch
的值应该是一个函数,而不是一个不带引号的表达式。考虑:
tryCatch(TRUE, error=cat("hello\n"))
# hello
# [1] TRUE
vs:
tryCatch(TRUE, error=function(e) cat("hello\n"))
# [1] TRUE
tryCatch(stop("boom"), error=function(e) cat("hello\n"))
# "hello"
在某些情况下,R会计算函数参数(包括此参数),因此在这种情况下,无论是否发生错误,都会在调用cat("hello\n")
行时计算表达式tryCatch
。
您也可以使用更简单的try
:
if(inherits(try(.progress$step(), silent=T), "try-error") .progress$init(length(v))