[Rcpp-devel] Bug with table sugar and NumericVector in Rcpp 0.10.3
romain at r-enthusiasts.com
romain at r-enthusiasts.com
Fri Mar 29 16:20:24 CET 2013
Cool. I'll have a look when I'm back from easter weekend.
Romain
Le 2013-03-29 16:00, Dirk Eddelbuettel a écrit :
> On 29 March 2013 at 09:40, Dirk Eddelbuettel wrote:
> |
> | On 29 March 2013 at 15:24, romain at r-enthusiasts.com wrote:
> | | Le 2013-03-29 14:31, Dirk Eddelbuettel a écrit :
> | | > On 29 March 2013 at 09:11, romain at r-enthusiasts.com wrote:
> | | > |
> | | > | Hello,
> | | > |
> | | > | This is related to this change:
> | | > |
> | | > | 2013-01-15 Dirk Eddelbuettel <edd at debian.org>
> | | > |
> | | > | * src/api.cpp (Rcpp): Commented-out coerce_to_string() for
> real
> | | > and
> | | > | complex arguments as R-devel (as of today) dislikes use of
> non-API
> | | > | functions Rf_EncodeComplex’, ‘Rf_EncodeReal’,
> ‘Rf_formatComplex’
> | | > |
> | | > | So maybe Dirk has a plan to fix it.
> | | >
> | | > I do not.
> | |
> | | Fine. So I'll fix it.
> |
> | Hold on.
> |
> | I am in the middle of it. I do have a poor replacementment for
> EncodeReal,
> | and am about to test one for complex. Will post soon.
> |
> | Am not covering scientific notation at this point.
>
> Ok, here replacement candidates. Kudos to Kevin for sending
> something
> reproducible that triggered this. This snipped below grew from his
> code and
> provids replacement candidates for coerce_to_string() for the real
> and
> complex cases, not using the internal R functions (which I also did
> not look
> at). Obviously the function headers need to change from the sample
> to what
> api.cpp uses.
>
> What we get is simple snprintf() calls which almost surely is less
> featureful
> than what R has, but please complaon to R Core about the sillyness of
> us not
> being able to use _existing and tested functions_. It's painful.
>
>
> Dirk
>
> #include <Rcpp.h>
>
> static const char* dropTrailing0(char *s, char cdec) {
> /* Note that 's' is modified */
> char *p = s;
> for (p = s; *p; p++) {
> if(*p == cdec) {
> char *replace = p++;
> while ('0' <= *p && *p <= '9')
> if(*(p++) != '0')
> replace = p;
> if(replace != p)
> while((*(replace++) = *(p++)))
> ;
> break;
> }
> }
> return s;
> }
>
> //template <>
> // const char* coerce_to_string/*<REALSXP>*/(double x){
> // [[Rcpp::export]]
> const char* coerce_to_stringRE(double x){
> int w,d,e ;
> // cf src/main/format.c in R's sources:
> // The return values are
> // w : the required field width
> // d : use %w.df in fixed format, %#w.de in scientific format
> // e : use scientific format if != 0, value is number of exp
> digits - 1
> //
> // nsmall specifies the minimum number of decimal digits in
> fixed format:
> // it is 0 except when called from do_format.
> Rf_formatReal( &x, 1, &w, &d, &e, 0 ) ;
> // we are no longer allowed to use this:
> // char* tmp = const_cast<char*>( Rf_EncodeReal(x, w, d, e,
> '.') );
> // so approximate it poorly as
> char tmp[128];
> snprintf(tmp, 127, "%*.*f", w, d, x);
> //Rcpp::Rcout << "Vec is " << vec << std::endl;
> return dropTrailing0(tmp, '.');
>
> }
>
> //template <>
> //const char* coerce_to_string/*<CPLXSXP>*/(Rcomplex x){
> // [[Rcpp::export]]
> std::string coerce_to_stringCP(Rcomplex x){
> int wr, dr, er, wi, di, ei;
> // cf src/main/format.c in R's sources:
> Rf_formatComplex(&x, 1, &wr, &dr, &er, &wi, &di, &ei, 0);
> //return Rf_EncodeComplex(x, wr, dr, er, wi, di, ei, '.' );
>
> // we are no longer allowed to use this:
> // Rf_EncodeComplex(x, wr, dr, er, wi, di, ei, '.' );
> // so approximate it poorly as
> char tmp[128];
> snprintf(tmp, 127, "%*.*f+%*.*fi", wr, dr, x.r, wi, di, x.i);
> return std::string(tmp); // force a copy
> }
>
> using namespace Rcpp;
>
> // // [[Rcpp::export]]
> // IntegerVector counts(NumericVector x) {
> // return table(x);
> // }
More information about the Rcpp-devel
mailing list