[Rcpp-devel] Rcpp shortcut for R's as.matrix and as.vector

Douglas Bates bates at stat.wisc.edu
Tue Mar 30 15:46:19 CEST 2010


On Tue, Mar 30, 2010 at 1:44 AM, Romain Francois
<romain at r-enthusiasts.com> wrote:
> Le 29/03/10 15:36, Douglas Bates a écrit :
>>
>> Most Lapack routines for solving linear systems from factorizations
>> allow the right hand side to be a matrix, thereby providing for
>> solving multiple systems in one  call.  I would like to preserve this
>> capability while also allowing for the most common case where the rhs
>> is a vector.  Also, I would like to return a vector solution rather
>> than a single matrix solution when it is a single column.
>>
>> I can accomplish these "as.matrix" and "as.vector" translations by
>> calling the corresponding R functions.
>>
>> static Rcpp::Function asMatrix("as.matrix")
>> static Rcpp::Function asVector("as.vector")
>>
>> and using those within Rcpp.  Is there an alternative within Rcpp?
>
> Not really. You can do :
>
> x.attr( "dim" ) = R_NilValue ;
>
> or
>
> x.attr( "dim" ) = IntegerVector::create( 5, 5 ) ;
>
>
> Here is a sketch for something we might want to add in the Matrix template:
>
> SEXP as_vector(){
>        SEXP x = ::Rf_duplicate( m_sexp ) ;
>        ::Rf_setAttrib( x, ::Rf_install( "dim" ), R_NilValue ) ;
>        // perhaps also dimnames
>        return x ;
> }
>
> or maybe this should return a VECTOR (which is a typedef to the appropriate
> Vector<RTYPE> in Matrix.

I'm asking all these questions because I haven't used templates in C++
and I keep thinking of ways that I would do things in other languages.
 With self-describing objects in R you can be rather flexible about
return types and for C code written against R you tend to have all
your objects expressed as SEXPs so again you have flexibility.  For
the time being I will simply use R's as.matrix in the R interface code
or as a Function object in Rcpp code.

> I don't really have time to play with this in the coming days, but if you
> try to add the function and some unit tests, I'll take time to review them.
> I could also sketch out Vector::as_matrix but I guess you also can.
>
>> I realize that I need to return another object so that it can have a
>> different class within C++ but I guess I would like
>>
>> NumericMatrix mat = Rcpp::as<NumericMatrix>(myNumericVector);
>
> I'm mot sure this will work (actually I'm almost sure this does not, but I
> did not test).
>
> You would essentially be calling the NumericMatrix( SEXP ) constructor which
> would not be happy about the argument not being a matrix.
>
>> or something similar.  It is not a big deal because the calls to the R
>> function are not a problem (or I could manipulate the SEXP internally)
>> but I'm wondering if I am missing something simple here.
>
>
> --
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
> http://romainfrancois.blog.free.fr
> |- http://tr.im/OIXN : raster images and RImageJ
> |- http://tr.im/OcQe : Rcpp 0.7.7
> `- http://tr.im/O1wO : highlight 0.1-5
>
>


More information about the Rcpp-devel mailing list