代码之家  ›  专栏  ›  技术社区  ›  user8401743

如何在MacOS上的rstudio中停止使用rcpp midday的r程序?

  •  0
  • user8401743  · 技术社区  · 6 年前

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

    下面是一个例子。

    testr<-function()。{
    i=1
    而(i>0)
    < /代码> 
    
    

    C++文件

    中的另一个函数
    //[[rcpp::export]]
    int测试cpp()。{
    双x=3;
    做{
    }同时(x>0);
    返回X;
    }
    < /代码> 
    
    

    当我调用testr然后单击控制台中的红色停止图标时,它将正常退出。 相反,如果我调用testcp并执行相同的操作,则会收到以下消息(如果我只单击一次,则必须按红色停止图标两次,否则不会发生任何情况)。如果单击“是”,会话将重新启动,并丢失变量。

    下面是一个例子。

    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 回复  |  直到 6 年前
        1
  •  3
  •   Kevin Ushey    6 年前

    你可以使用 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,应该看到如下内容:

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

    请注意,如果使用 Rcpp attributes 由于相关的Try-Catch异常处理程序将自动在包装函数中为您生成。我只是在这里添加它们来说明RCPP通过抛出一个特殊的异常来响应这个API的中断。