检查中止
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;
}
}
}
我过去常常依赖包 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;
}
}
}