提高Rcpp中的异常

时间:2011-12-08 22:38:04

标签: c++ r rcpp

我正在尝试报告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'
> 

2 个答案:

答案 0 :(得分:5)

你可以

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

  • 或者自己动手操作,如我博客上的一系列示例所示,或Rcpp包的示例/部分

但做你所做的事(即:在try / catch块之外抛出)永远不会有效。

作为额外的奖励,这是一个完整的例子(基本上已经存在于单元测试中):

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()块,因为您可以看到verbose是否开启:

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。

答案 1 :(得分:3)

将代码包装在BEGIN_RCPP / END_RCPP

RcppExport SEXP bar( SEXP x){
BEGIN_RCPP

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

END_RCPP
}

请注意,您也可以抛出正常的std异常:

throw std::invalid_argument("'x' is too short");