[Rcpp-devel] Matrix columns

Dirk Eddelbuettel edd at debian.org
Sun May 15 00:24:14 CEST 2011


On 14 May 2011 at 23:12, Nick Sabbe wrote:
| I?ve been trying the following, with the main part ripped from rcpp-quickref:
| 
|     SEXP dfr2Mat(SEXP dfr)

A much easier way is to, say, call as.matrix() in R and then assign to an
NumericMatrix object in C++.  

Another way is turn the Data.Frame into a list via as.list() as just pick off
column after column.

|     {
|         DataFrame df = dfr;
|         int* dm = INTEGER( ::Rf_getAttrib( df, R_DimSymbol ) ) ;
|         int rows = dm[0];
|         int cols = dm[1];
|         NumericMatrix retMat (rows, cols);
|         for(int i = 0; i < cols; i++)
|         {
|             NumericVector curcol = df(i);
|             NumericMatrix::Column cl = retMat.( _, i);

Why is retMat on the right-hand side if you try to fill it?  Makes no real sense.

|             cl = curcol;
|         }
|         return retMat;
|     }

I can see no straightforward way to write given how objects are organized
internally.  Once a Rcpp::DataFrame object is instantiated, you can call
size() which gives you the number of columns.  So here is a really
complicated way to do this, but let me reiterate that I think you are
starting from the wrong starting point: if your data.frame really is a
matrix, just use a matrix:

R> require(inline)
Loading required package: inline
R> 
R> df2mat <- cxxfunction(signature(Dsexp="ANY"), plugin="Rcpp", body='
+    // construct the data.frame object
+    Rcpp::DataFrame DF = Rcpp::DataFrame(Dsexp);
+ 
+    // we get ncol() from DF
+    int k = DF.size();
+ 
+    // but for nrow() we need to assign first; one way is:
+    Rcpp::NumericVector V = DF[0];
+    int n = V.size();
+ 
+    Rcpp::NumericMatrix M(n,k);
+ 
+    for (int i=0; i<k; i++) {
+        V = DF[i];
+        M(_,i) = V;  // one way to assign using sugar operator _
+    }
+ 
+    return M;
+ ')
R> M <- df2mat(data.frame(a=1:5, b=seq(1.1,5.5,by=1.1)))
R> M
     [,1] [,2]
[1,]    1  1.1
[2,]    2  2.2
[3,]    3  3.3
[4,]    4  4.4
[5,]    5  5.5
R> class(M)
[1] "matrix"
R> 


Hope this helps,  Dirk

-- 
Gauss once played himself in a zero-sum game and won $50.
                      -- #11 at http://www.gaussfacts.com


More information about the Rcpp-devel mailing list