我有一个长时间运行的过程,用“R”编码。我想继续在RStudio中运行它,我不想使用批处理模式。
我想允许用户优雅地终止长时间运行的进程,例如按下转义键。如果用户没有按任何内容,则该过程继续,无需等待。
我已阅读其他StackOverflow帖子,也许我需要在不同的线程上提示用户使用scan / readline。这样,主执行线程就不会被阻止。
有没有更简单的方法?
感谢您提出任何建议。
理查德罗杰斯
进一步评论:
我犯了一些错误:
这是一个简单的功能:
ProcessData <- function()
{
Continue <- TRUE
Iteration <- 1
TestData <- vector(mode = "integer", length = 100000)
while (Continue)
{
writeLines(sprintf("Processing iteration %d, Current time is %s", Iteration, Sys.time()))
process.events()
TestData <- round(runif(100000, min = 1, max = 10))
# Continue <- PromptUser()
Iteration <- Iteration + 1
}
writeLines("Processing ending.")
head(TestData)
}
如果我在循环运行时按下escape,则不会执行writeLines和head调用。我怎样才能确保他们这样做?
再次感谢你,
理查德
答案 0 :(得分:1)
我知道这是一个老问题,但由于我有类似的背景(长期运行的任务),这就是我想出的:
long_computation <- function() for(i in 1:10) Sys.sleep(1)
exit_gracefully <- function() cat("Saving results so far...\n")
tryCatch(
long_computation(),
finally = exit_gracefully()
)
如果我们在计算过程中按下escape,则不会抛出错误条件;但是finally
的{{1}}部分会被执行。这允许我们清理,关闭连接等。