【问题标题】:How to print progress bar of R function without for loop?如何在没有for循环的情况下打印R函数的进度条?
【发布时间】:2021-01-06 15:18:32
【问题描述】:

我有一个需要很长时间才能运行的函数(涉及大型数据集中的许多计算)。我想包括一个进度条,看看它是否正在取得进展。我的函数没有 f​​or 循环;如果函数中没有 for 循环,我不明白如何添加进度条。

我尝试添加一个 for 循环来让进度条工作,但它只是打印进度条而不进行计算(我相信),即当我打印 result 时,我得到 NULL

install.packages("svMisc")
require("svMisc")

# Test function
funct<-function(a,b,c)for (i in 0:101){
  progress(i, progress.bar=TRUE)
  Sys.sleep(0.01)
  x<-a*a
  y<-x+b
  z<-y/2
  if (i == 101) message("Done!")
}

result <- funct(-2.6e+70,-2.5e+121,6)
result

请随意提出svMisc以外的建议。

【问题讨论】:

  • 您的示例正在在函数中进行计算,只是不返回它。要么将z &lt;-y/2 移动到函数的最后一行,要么在 if 语句后添加显式 return(z)
  • 以上建议的任何更改都需要额外的大括号
  • @Miff,请发表您的评论作为答案?

标签: r function progress


【解决方案1】:

一般来说,报告函数的进度将需要一个循环(或可能需要多行代码),正如您在示例中所阐述的那样。您的示例 正在 执行计算,只是没有返回它们 - 请记住,R 函数返回最后一次计算的值,除非有明确的 return() 语句。在这种情况下,message() 函数返回NULL

对下面代码的小修改演示了进度条的预期行为,随后是 result 具有计算值。

install.packages("svMisc")
require("svMisc")

# Test function
funct<-function(a,b,c){
  for (i in 0:101){
    progress(i, progress.bar=TRUE)
    Sys.sleep(0.01)
    x<-a*a
    y<-x+b
    z<-y/2
    if (i == 101) message("Done!")
  }
  return(z)
}

result <- funct(-2.6e+70,-2.5e+121,6)

#           0%---------25%---------50%---------75%--------100%
# Progress: ||||||||||||||||||||||||||||||||||||||||||||||||||
# Done!

result

# [1] 3.38e+140

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2014-02-19
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多