[Rcpp-devel] Segfaults
Romain François
romain at r-enthusiasts.com
Wed Jan 4 15:49:22 CET 2012
Le 04/01/12 15:33, Hadley Wickham a écrit :
> Hi all,
>
> Is it a bug to cause a segfault with Rcpp? Or are am I doing something
> so dumb that an automatic check could never protect? See minimal
> reproducible example below.
>
> Hadley
>
> library(inline)
> f<- cxxfunction(signature(x = "numeric", i = "numeric"), plugin = "Rcpp", '
> Rcpp::NumericVector x_(x);
> Rcpp::NumericVector i_(i);
>
> x_[(int) (i_[0]) - 1] = 1000;
>
> return(x_);
> ')
> f(1:10, 1) # works
> f(1:10, 1.5) # also works
> f(1:10, NA) # segfaults
>
That is because of underlying C++ double arithmetics:
fx <- cxxfunction( signature( x_ = "numeric"), '
double x = as<double>(x_) ;
Rprintf( "%5.2f\\n", x ) ;
', plugin = "Rcpp" )
fx( NA )
So your i_[0] - 1 is also nan. You are responsible for dealing with na.
You can use traits::is_na:
fx <- cxxfunction( signature( x_ = "numeric"), '
double x = as<double>(x_) ;
if( traits::is_na<REALSXP>(x) ){
// do something
} else {
// do something else
}
', plugin = "Rcpp" )
or perhaps if you don't like the whole traits::is_na<REALSXP> thing, you
could use e.g. somethin like this:
template <typename T>
bool isna( T x ){
return traits::is_na<traits::r_sexptype_traits<T>::rtype > (x) ;
}
so that you coud just call
if( isna(x) ){ ... }
Romain
--
Romain Francois
Professional R Enthusiast
http://romainfrancois.blog.free.fr
More information about the Rcpp-devel
mailing list