我有一个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
并执行相同的操作,则会收到以下消息(我必须按红色的停止图标两次,如果只单击一次,什么也没有发生)。如果单击“是”,则会话将重新启动,并且丢失变量。
“”
答案 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通过引发特殊异常来响应中断。