[Rcpp-devel] Deriving type information

Søren Højsgaard sorenh at math.aau.dk
Fri Feb 14 11:33:04 CET 2014


Thanks to Kevin and Romain :)
mvh
Søren


-----Original Message-----
From: Romain François [mailto:romain at r-enthusiasts.com] 
Sent: 14. februar 2014 00:55
To: Søren Højsgaard
Cc: rcpp-devel at lists.r-forge.r-project.org (rcpp-devel at r-forge.wu-wien.ac.at)
Subject: Re: [Rcpp-devel] Deriving type information

In addition to what Kevin said, perhaps you are looking for macros from this file:
https://github.com/RcppCore/Rcpp/blob/master/inst/include/Rcpp/macros/dispatch.h

Le 14 févr. 2014 à 00:34, Søren Højsgaard <sorenh at math.aau.dk> a écrit :

> Dear all,
> 
> Function foo_num below takes a numeric vector and returns a list with the first element of the vector. (Not very interesting function). I want to create a templated version of this in function do_foo below, but whether "a" should be a double, an integer, or a string depends on the RTYPE. 
> 
> My question is (and it is embarrasing to ask because I believe Romain has already answered it; just can't find the answer) how to derive the what type "a" should have once we know RTYPE??
> 
> My second question is: Isn't there an easier general way to write the dispatch function (I have in mind situations where the templated function takes *more* than one argument!)? I have in mind something like:
> 
>  int type = TYPEOF(XX_) ;
>  return do_foo<type> ( XX_ ) ;
> 
> but that fails because INTSXP, REALSXP etc seems to be defined as const's (thats my reading of the compiler message).

What goes into template parameters is compile time constant. And the type of an R object is dynamic, there is no way to know before runtime, so the compiler can not do this for you. 

> 
> Thanks
> Søren
> 
> 
> #include <Rcpp.h>
> using namespace Rcpp;
> //[[Rcpp::export]]
> List foo_num(NumericVector x){
>  double a=x[0];
>  return List::create( a );
> }
> 
> template <int RTYPE>
> List do_foo( Vector<RTYPE> x ){
>  double a=x[0]; // WHAT TO DO HERE???
>  return List::create( a );
> }
> 
> SEXP foo_any( SEXP& XX_){
>  int type = TYPEOF(XX_) ;
>  switch( type ){
>  case INTSXP  : return do_foo<INTSXP> ( XX_ ) ;  case REALSXP : return 
> do_foo<REALSXP>( XX_ ) ;  case STRSXP  : return do_foo<STRSXP> ( XX_ ) 
> ;  }  return R_NilValue ; } 
> _______________________________________________
> 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-deve
> l



More information about the Rcpp-devel mailing list