如何在MacOS的Rstudio中使用Rcpp中途停止R程序?

时间:2018-07-25 12:51:46

标签: rstudio

我有一个R项目,该项目使用Rcpp进行长时间的模拟。当我尝试停止在Rstudio中使用这样的程序(例如,它花费的时间太长或我不再对那些结果感兴趣)时,Rstudio崩溃。本质上,我正在寻找一种在不使Rstudio崩溃的情况下杀死Rcpp函数的方法,以便我可以使用一些不同的参数再次运行它而不会在R环境中丢失变量(当R studio崩溃时)。我可以在调用函数之前保存和加载环境,但我希望可能有一个优雅的解决方案。有什么建议吗?

这里是一个例子。

testR <- function(){
    i=1  
    while(i>0){}}

C ++文件中的另一个功能

// [[Rcpp::export]]
int testCpp( ) {
  double x=3;
  do{
  } while (x>0);
  return x;
}

当我致电testR,然后在控制台中单击红色的停止图标时,它将正常退出。 相反,如果我致电testCpp并执行相同的操作,则会收到以下消息(我必须按红色的停止图标两次,如果只单击一次,什么也没有发生)。如果单击“是”,则会话将重新启动,并且丢失变量。 enter image description here

“”

1 个答案:

答案 0 :(得分:3)

您可以使用Rcpp::checkUserInterrupt()。例如:

#include <unistd.h>
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void forever() {

  try
  {
    for (int i = 0; ; i++)
    {
      Rcout << "Iteration: " << i << std::endl;
      ::sleep(1);
      Rcpp::checkUserInterrupt();
    }
  }
  catch (Rcpp::internal::InterruptedException& e)
  {
    Rcout << "Caught an interrupt!" << std::endl;
  }

}

/*** R
forever()
*/

如果您尝试在运行R时中断R,您应该会看到类似以下内容的

> Rcpp::sourceCpp('scratch/interrupt.cpp')
> forever()
Iteration: 0
Iteration: 1
Iteration: 2

Caught an interrupt!

请注意,如果您使用Rcpp attributes,则try-catch块是不必要的,因为关联的try-catch异常处理程序将自动在包装函数中为您生成。我只是在此处添加它们,以说明Rcpp使用此API通过引发特殊异常来响应中断。