gpt4 book ai didi

c++ - 在 Rcpp 中引发异常

转载 作者:可可西里 更新时间:2023-11-01 17:39:31 25 4
gpt4 key购买 nike

我正在尝试报告我的 rcpp 代码中的错误。我正在使用来自 http://dirk.eddelbuettel.com/code/rcpp/html/classRcpp_1_1exception.html 的构造函数 exception (const char *message_, const char *file, int line) .为了隔离问题,我编写了以下 bar.cpp:

#include <Rcpp.h>

RcppExport SEXP bar( SEXP x){
throw(Rcpp::exception("My Error Message","bar.cpp",4));
return x ;
}

当我在 R 中运行它时,这是我得到的:

> dyn.load("bar.so")
> is.loaded("bar")
[1] TRUE
> .Call("bar",12)
Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'NULL'
>

最佳答案

你可以

  • 使用 inlinetry/catch block 放入它为您生成的函数中的包(通过使用两个简单的宏)

  • 或者您自己手动完成,如我博客上的一系列示例所示,或在 Rcpp 的示例/部分中所示。包,

但是做你做的事(即:抛出 try/catch block )永远行不通。

作为额外的好处,这里有一个完整的示例(它基本上已经存在于单元测试中):

R> library(inline)
R> f <- cxxfunction(signature(), plugin="Rcpp", body='
+ throw std::range_error("boom");
+ return R_NilValue;
+ ')
R> f()
Error in f() : boom
R>

同样,cxxfunction() 在这里为您放置了一个 try/catch() block ,您可以看到是否将 详细:

R> f <- cxxfunction(signature(), plugin="Rcpp", body='
+ throw std::range_error("boom");
+ return R_NilValue;
+ ', verbose=TRUE)
>> setting environment variables:
PKG_LIBS = -L/usr/local/lib/R/site-library/Rcpp/lib \
-lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib

>> LinkingTo : Rcpp
CLINK_CPPFLAGS = -I"/usr/local/lib/R/site-library/Rcpp/include"

>> Program source :

1 :
2 : // includes from the plugin
3 :
4 : #include <Rcpp.h>
5 :
6 :
7 : #ifndef BEGIN_RCPP
8 : #define BEGIN_RCPP
9 : #endif
10 :
11 : #ifndef END_RCPP
12 : #define END_RCPP
13 : #endif
14 :
15 : using namespace Rcpp;
16 :
17 :
18 :
19 : // user includes
20 :
21 :
22 : // declarations
23 : extern "C" {
24 : SEXP file4cc53282( ) ;
25 : }
26 :
27 : // definition
28 :
29 : SEXP file4cc53282( ){
30 : BEGIN_RCPP
31 :
32 : throw std::range_error("boom");
33 : return R_NilValue;
34 :
35 : END_RCPP
36 : }
37 :
38 :
Compilation argument:
/usr/lib/R/bin/R CMD SHLIB file4cc53282.cpp 2> file4cc53282.cpp.err.txt
ccache g++-4.6 -I/usr/share/R/include \
-I"/usr/local/lib/R/site-library/Rcpp/include" \
-fpic -g0 -O3 -Wall -pipe -Wno-unused -pedantic -c file4cc53282.cpp \
-o file4cc53282.o
g++ -shared -o file4cc53282.so file4cc53282.o \
-L/usr/local/lib/R/site-library/Rcpp/lib \
-lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
-L/usr/lib/R/lib -lR
R>

BEGIN_RCPPEND_CPP 在这里添加了您需要的魔法。

将您的问题移至 rcpp-devel。

关于c++ - 在 Rcpp 中引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438701/

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