[Rcpp-devel] Rcpp catching a domain error
Dirk Eddelbuettel
edd at debian.org
Thu Dec 11 16:36:07 CET 2014
Hi there,
On 11 December 2014 at 10:27, Qiang Kou wrote:
| Hi, Devin,
|
| I don't whether this is the standard solution.
|
| As I understand, the default error handler in GSL will abort the program after
| printing error message. So you need to close it first.
Qiang beat me to it, but when I ran your example (in a standard R session, in
my case inside Emacs) I get
R> sourceCpp("/tmp/rcppgslabort.cpp")
R> simpletest()
gsl: hyperg_2F1.c:667: ERROR: domain error
Default GSL error handler invoked.
Process R aborted (core dumped) at Thu Dec 11 09:30:40 2014
which unmistakenly shows __GSL__ aborting here so our try/catch can't do
anything for us.
Luckily Qiang is much on the case than I was:
| In most time I don't use try-catch with GSL, I detect whether the result is
| 'nan' or not. Try the code below:
|
| Best,
|
| KK
|
| // [[Rcpp::depends(RcppGSL)]]
| #include <RcppGSL.h>
| #include <gsl/gsl_sf_hyperg.h>
|
| #include <Rcpp.h>
| #include <math.h>
| using namespace Rcpp;
|
| // [[Rcpp::export]]
| int test()
| {
| gsl_set_error_handler_off();
| printf ("status = %f\n", gsl_sf_hyperg_2F1(1,1,1.1467003,1));
| printf ("status = %f\n", gsl_sf_hyperg_2F1(-10.34,2.05,3.05,0.1725));
| return 0;
| }
That's a nice trick:
R> sourceCpp("/tmp/rcppgslabort.cpp")
R> fixedtest()
status = nan
status = 0.310474
[1] 0
R>
Qiang, how about wrapping ten lines of context around
it and making it an Rcpp Gallery post? This ought to be documented....
Dirk
|
|
| On Thu, Dec 11, 2014 at 10:03 AM, Devin <devin.heer at gmail.com> wrote:
|
|
| Dear list
|
|
|
| My Rcpp source file contains a gsl_sf_hyperg_2F1() function, and for some
| input values to this function the return value is “NaN”, which leads in
| RStudio to an abortion error.
|
|
|
| In order to avoid abortion errors, I try to implement a try/catch exception
| handler:
|
|
| // [[Rcpp::depends(RcppGSL)]]
|
| #include <RcppGSL.h>
|
| #include <gsl/gsl_sf_hyperg.h>
|
|
|
| #include <Rcpp.h>
|
| #include <math.h>
|
| using namespace Rcpp;
|
|
|
| // [[Rcpp::export]]
|
| int test()
|
| {
|
| try{
|
| gsl_sf_hyperg_2F1(1,1,1.1467003,1); // abortion error since not
| defined
|
| }
|
| catch(std::domain_error& e){
|
| std::cout << "Domain Error occurred!" << std::endl;
|
| }
|
| return 0;
|
| }
|
|
|
| This seems to be wrong, since it still causes an abortion error in RStudio.
|
|
|
| I appreciate any input
|
|
|
| Thanks
|
| Devin
|
|
|
|
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
|
|
|
|
| --
| Qiang Kou
| qkou at umail.iu.edu
| School of Informatics and Computing, Indiana University
|
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list