【问题标题】:How to interrupt at loop end如何在循环结束时中断
【发布时间】:2015-03-06 16:33:57
【问题描述】:

如何在 R 中编写一个循环,以便如果我按下 esc 它不会在循环中间而是在循环结束时停止?所以说我想定义可以安全中断循环的点。

我每秒都在运行一个带有情节的迭代。如果视觉结果没有朝着正确的方向发展,我希望能够中断迭代,调整一些参数并继续迭代。现在我通过按esc 或GUI 中的停止按钮来执行此操作。但这会破坏一些数据,因为中断发生在计算中间。所以我无法继续迭代。

【问题讨论】:

  • 如果有一个小例子就好了。我想以某种方式避免数据损坏然后实现所需的行为会更容易。
  • @tonytonov 我在循环中有一个apply,当我中断时,它有时只工作到一半。这样我的网格中只有一半的单元格被更新了。
  • @Metrics 如果我只能在按下某个键时输入browser,这将起作用。
  • 您可以在例程中的适当位置检查文件是否存在,例如“TerminationDesired.txt”。如果您发现该文件存在,请终止您喜欢的任何方式。然后,只要您希望程序结束,只需创建文件即可。我似乎无法在 R 中找到一个只检查可选按键的例程。

标签: r


【解决方案1】:

这是一个使用withRestarts 并劫持“中止”重启的选项。尝试运行代码并在循环进行时按“ESC”:

# Make up a task that takes some time

task_to_perform_in_loop <- function() for(i in 1:100) Sys.sleep(0.01)

# Run task in loop
{
  stopAtEnd <- FALSE
  for(i in 1:5) {
    cat("Loop #", i, "\n", sep="")
    withRestarts(
      task_to_perform_in_loop(),
      abort=function(e) {
        message("Will stop when loop complete")
        stopAtEnd <<- TRUE
      }
    )  
  }
  if(stopAtEnd) stop("Stopping After Finishing Loop")  
  cat("Continuing After Finishing Loop")
}

请记住,这将阻止您在没有向 R 发送终止命令的情况下真正退出循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2016-01-12
    相关资源
    最近更新 更多