【问题标题】:R display in console two progress bars stacked (with code)R 在控制台中显示堆叠的两个进度条(带代码)
【发布时间】:2018-03-10 06:07:43
【问题描述】:

可以这样做吗?我想在 R 中同时显示两个垂直堆叠的进度条,因为一个函数在另一个更大的函数中运行。

一个用于较大功能的整体进程状态,另一个用于功能内的各个进程(下载等)。

  1. 如果可能的话,我想使用进度包的 progress_bar(如果不可能的话,base 或任何很酷的解决方案!:))

  2. 我想留在控制台中,而不是使用 tk 或类似的解决方案绘制进度条(https://www.r-bloggers.com/multiple-progress-bars/)

提前致谢!

以下示例在进度(首选)和 Base R 中模拟所需的功能和结果:

 ###Example in progress package(preferred)
library(progress)

###Create the progress bars
overallbar <- progress_bar$new(
  format = " downloading :what [:bar] :percent Guestimated Remaining OVERALL: :eta",
  clear = FALSE, total = 1000, width = 60)
statusbar <- progress_bar$new(
  format = " [:bar] :percent Guestimated Remaining CURRENT FILE: :eta",
  clear = FALSE, total = 100, width = 60)

###Only displays the statusbar when I'd like to display both

for (i in 1:1000) {
  overallbar$tick()
  statusbar$tick()
  Sys.sleep(1 / 1000)
}

###Desired outcome (imitation only)
downloading THIS FILE NOW [] 100% Guestimated remaining OVERALL:  0s
[============] 100% Guestimated remaining CURRENT FILE:  0s

一个使用 BASE R INSTEAD 的示例(不如进度包样式需要):

###Base R
pb1   <- txtProgressBar(1, 1000, style=3)
pb2   <- txtProgressBar(title="File Progress",1, 100, style=3)


###Like progress, base also only displays the second progress bar 

cat("OVERALL PROGRESS:")
for (i in 1:1000) {
  setTxtProgressBar(pb1, i)
  ###something is funky with the title option, not working
  ###I usually use progress package, you get the idea, I'd like a title
  setTxtProgressBar(title="File Progress:", pb2, i)
  Sys.sleep(1 / 1000)
}

###Desired outcome (imitation only)

OVERALL PROGRESS:
|========================================================================================| 100%
File Progress:
|========================================================================================| 100%

【问题讨论】:

    标签: r function console progress-bar progress


    【解决方案1】:

    至少在 Base R 的情况下,进度条通过简单地重新绘制同一条线来工作。您可以使用 ANSI 转义序列在行之间跳转。修改您的 Base R 示例,

    cat("OVERALL PROGRESS:\n\n") # 2 newlines leaving a blank between headers
    cat("File Progress:\n") # 1 newline leaves in position for pb2
    for (i in 1:1000) {
      cat("\033[2A")   # up 2 lines for pb1
      setTxtProgressBar(pb1, i)
      cat("\033[2B")   # down 2 lines for pb2
      setTxtProgressBar(title="File Progress:", pb2, i)
      Sys.sleep(1 / 1000)
    }
    cat("\033[2B\n") # for good measure
    

    这适用于 Linux,可能也适用于 MacOS 终端和 maybe even Windows,尽管我没有在那里测试。

    【讨论】:

    • 谢谢!我最终得到了非常相似的东西,但是使用 writeLines 并使用 cat("\014") 清除整个控制台。 . .我将不得不清理超级旧的 Windows 计算机,并测试您的计算机是否可以在 Windows 上运行。我不认为你可以在 Windows 中清除整个控制台,所以我怀疑我的工作在 Windows 中,你可以在 Windows 中上下多行吗?我知道存在严重的限制。
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多