检查中止

Check for abort

我过去常常依赖包 RcppProgress 来检查 Progress::check_abort() 的长循环中的用户是否中止。但是我刚刚收到 CRAN 团队的一封电子邮件,告诉我(和其他维护者)RcppProgress 有错误,并且在没有维护者的情况下将很快被删除(实际上它似乎已经被删除)。还有其他检查流产的方法吗?

我发现 R_CheckUserInterrupt 存在。如何更改我的代码以使用此功能?在 Writing R extensions 函数中 returns void 所以我不明白它是如何工作的。好像马上就退出了。

Rcpp::checkUserInterrupt 似乎呈现相同的行为。 提出了一种其作者未推荐的技巧。我想退出循环正确清理堆上分配的对象并返回部分输出

// [[Rcpp::depends(RcppProgress)]]
#include <progress.hpp>
#include <Rcpp.h>

// [[Rcpp::export]]
SEXP f()
{
  for( int i = 0 ; i < 100000 ; i++)
  {
    if (Progress::check_abort())
    {
       delete some_var;
       return partial_output;
    }
    else
      //do_stuff();
  }
}

阅读 Rcpp 的来源后,我发现 Rcpp::checkUserInterrupt() 抛出一个 internal::InterruptedException。这有效:

for (long i = 0 ; i < 100000000 ; i++)
{
    try 
    {
      Rcpp::checkUserInterrupt();
    }
    catch(Rcpp::internal::InterruptedException e) 
    {
      delete some_var;
      return partial_output;
    }
 }

它很慢,但完全像 Process::check_abort。可选地,如 Rcpp Attributes 中所建议的,可以每 100 或 1000 次迭代检查一次以加快代码速度。

for (long i = 0 ; i < 100000000 ; i++)
{
  if (i % 100 == 0)
  {
     try 
     {
       Rcpp::checkUserInterrupt();
     }
     catch(Rcpp::internal::InterruptedException e) 
     {
       delete some_var;
       return partial_output;
     }
   }
 }