gpt4 book ai didi

c++ - 如何正确捕获 Rcpp 异常?

转载 作者:行者123 更新时间:2023-12-01 14:47:17 24 4
gpt4 key购买 nike

我创建了一个如下所示的函数:

#include <Rcpp.h>


//[[Rcpp::export]]
void fun(SEXP num = R_NilValue){
if(!Rf_isNull(num)){
try{
int NUM = Rcpp::as<int>(num);
}catch(...){
Rcpp::stop("Exception occured!");
}
}
}
此函数作为 R 包的一部分导出并包含在 Makevars 中。现在,如果我将字符串值作为参数传递给此函数 ( fun("a")),我将无法捕获异常,并且 R session 正在中止和崩溃。有什么办法可以捕捉到这个异常?
在这种情况下,我想要实现的目标是确保不将不正确的类型参数传递给函数。
如果我使用显示的调用而不是前一个调用,R session 将中止:
// [[Rcpp::export]]
std::string fun(int imax = 214748364) {
return "okay";
}
现在,调用 fun('a')即使我的类型不匹配,也会在这里导致崩溃。

最佳答案

您的示例不完整,因为您没有告诉我们您如何构建和调用该函数。
“一般来说”你不需要任何东西,就像 R 为你做的那样。最简单的例子:

R> cppFunction("int doubleMe(int x) { return x + x; }")
R> doubleMe(21)
[1] 42
R> doubleMe("this won't work")
Error in doubleMe("this won't work") :
Not compatible with requested type: [type=character; target=integer].
R>
如果您使用 cppFunctionsourceCpp()在详细模式下,您会看到生成的代码。如果您遵循该代码,包括 #define使用你会看到它已经包含一个 try/catch阻止你,这就是为什么我说你不需要做任何事情。
现在,您当然可以使用 R CMD COMPILE 以(非常)旧的方式“手动”构建函数。和 friend 们——我 10 多年前的旧演讲展示了如果你需要快速阅读——并插入手册 try/catch block 自己尝试一下。
简而言之,“内部”Rcpp 代码确实会引发异常,这就是设置“外部”Rcpp 代码来捕获它们的原因。它工作得很好,并且经过多年的改进,以解决大多数在实现中可能与操作系统相关的问题。
编辑:这里是 an old StackOverflow answer of mine from 2009展示了如何在 Rcpp 属性之前的日子里“手动”编译。它包括一个 try/catch然后我们总是(手动)包含的 block 。
编辑 2:感谢您编辑您的问题。如果您使用 [[Rcpp::export]]最简单的版本是
//[[Rcpp::export]]
void fun(int num) {
// do nothing
}
显示所需的行为:
R> sourceCpp("~/git/stackoverflow/63049304/answer.cpp")
R> fun(2)
R> fun("lalala")
Error in fun("lalala") :
Not compatible with requested type: [type=character; target=integer].
R>
编辑 3 您的示例,正​​如您在上次编辑中发布的那样,甚至无法编译。
修复后,它的行为和往常一样。
R> cppFunction('std::string fun(int imax=1234) { return("okay"); }')
R> fun("a")
Error in fun("a") :
Not compatible with requested type: [type=character; target=integer].
R> fun('a')
Error in fun("a") :
Not compatible with requested type: [type=character; target=integer].
R>

关于c++ - 如何正确捕获 Rcpp 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63049304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com