命令行R中的进度条

时间:2018-01-04 22:14:34

标签: r

我试图在R脚本中使用进度条用于命令行,但它只显示0%。请考虑以下工作示例:

 testit <- function(x = sort(runif(20)), ...)
 {
     pb <- txtProgressBar(...)
     for(i in c(0, x, 1)) {Sys.sleep(0.5); setTxtProgressBar(pb, i)}
     Sys.sleep(1)
     close(pb)
 }
 testit()
 testit(runif(10))
 testit(style = 3)

但是,我的代码无法正常工作,我无法识别我的错误:

  dep=c("data.table", "docopt")
  for (i in dep){
    pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
    if (i %in% installed.packages()){
      library(i, character.only = TRUE)
    } else {
      install.packages(i, repos="http://cran.rstudio.com/", dependencies = T)
      library(i, character.only = TRUE)
    }
    setTxtProgressBar(pb, i)
  }
  close(pb)
  • 如何让进度条在后者中实际进展?

3 个答案:

答案 0 :(得分:0)

两个问题:icharacter而不是数字;并且您每次在循环中重新分配到pb。格雷戈尔建议保持i一个整数(我偏好他的两个建议)可以这样实现:

dep=c("data.table", "docopt")
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
for (i in seq_along(dep)){
  if (dep[i] %in% installed.packages()){
    library(dep[i], character.only = TRUE)
  } else {
    install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
    library(dep[i], character.only = TRUE)
  }
  setTxtProgressBar(pb, i)
}
close(pb)

(未经测试,因为我没有您的数据。)

答案 1 :(得分:0)

我的评论基本上是一个答案,所以:

setTxtProgressBar需要它的第二个参数是介于0和1之间的数字。您提供的i首先是"data.table",然后是"docopt"

修改代码工作的最快方法是计算每次迭代的距离。加入你的循环:

fraction_done = match(i, dep) / length(dep)
setTxtProgressBar(pb, fraction_done)

在这种情况下,我们会计算分数,以便您可以使用默认的1作为进度条长度。

我更喜欢的选项是重写您的循环,以便i1, 2, 3, ...。虽然R允许你循环遍历任意值,但它可能会导致你问题中的混乱。相反,我几乎总是循环超过1,2,3 ......有时它需要更多的打字,但它清晰而一致。在这种情况下:

dep=c("data.table", "docopt")
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)

for (i in seq_along(dep)){
  if (!dep[i] %in% installed.packages()){
    install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
  }
  library(dep[i], character.only = TRUE)
  setTxtProgressBar(pb, i)
}
close(pb)

我还简化了一点结构(如果你切换elseif并不是真正需要的。并且,正如评论中指出的那样,您希望在循环之前启动条形,而不是每次都循环。

答案 2 :(得分:0)

问题是i是一个字符串,而不是你给出的第一个例子中的整数,你可能会看起来更像

dep=c("data.table", "docopt")
for (i in seq_along(dep)){
  pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
  if (dep[i] %in% installed.packages()){
    library(dep[i], character.only = TRUE)
  } else {
    install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
    library(dep[i], character.only = TRUE)
  }
  setTxtProgressBar(pb, i)
}
close(pb)