R中的递归函数中的create_progress_bar

时间:2015-06-09 11:03:58

标签: r recursion plyr

我正在尝试改进我的递归函数的日志,该函数在页面中拆分向量输入并为每个页面调用自己来做事。

为此,我想使用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我知道单个和多个块的输出是不同的,但是对于示例的目的并不重要

1 个答案:

答案 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))