2011-12-08 18 views

cevap

5

Ya

  • kullanabilirsiniz:

    Ben R çalıştırmak
    #include <Rcpp.h> 
    
    RcppExport SEXP bar(SEXP x){ 
         throw(Rcpp::exception("My Error Message","bar.cpp",4)); 
         return x ; 
    } 
    

    , bu ne alıyorum Sizin için oluşturduğu işleve try/catch bloğunu koyan inline paketi (iki basit makro kullanarak)

  • veya bloguma örneklerinden bir demet gösterildiği gibi manuel kendiniz yapmak veya örneklerde/Rcpp paketinin bölümü

ama (yani yapıyor: Bir deneyin dışında atma/catch bloğu asla işe yaramaz. eğer gördüğünüz gibi

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> 

Yine cxxfunction() senin için burada bir try/catch() blok koyar: Ek bir avantaj olarak

, burada (aslında zaten birim testlerde mevcut) tam bir örnektir burada gerek sihirli ekleyin

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_RCPP ve END_CPP: üzerinde verbose açın.

Lütfen sorularınızı rcpp-devel'e taşıyın.

+0

Teşekkür! Örneklerden, "copyMessageToR" ve "Rf_error", RcppDateExample.cpp'de kullanıldığı anlamına mı geliyor? CopyMessageToR için belge bulamadım. – highBandWidth

+0

Aah ... ama burada sormak, sadece iyi çalışıyor, her şeyden önce dakikalar içinde mükemmel cevaplar veriyor! Benim driftimi yakaladın mı? ;) –

+0

Evet. "Catch()" bloğunda kullandığınız şey budur. –

3

Sadece BEGIN_RCPP/END_RCPP içine kodunuzu sarın:

RcppExport SEXP bar(SEXP x){ 
BEGIN_RCPP 

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

END_RCPP 
} 

Not Eğer çok normal bir std istisnalar atabilir:

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

"BEGIN_RCPP" ve "END_RCPP" ekledikten sonra bile, "Rcpp :: exception" hala aynı "STL_VECTOR_ELT" hatasını veriyor. std :: invalid_argument' bir istisna atar, ancak R'de görüntülenen mesaj jenerik bir 'Error: C++ istisnasıdır (bilinmeyen sebep)' dir. – highBandWidth