On Tue, Sep 7, 2010 at 11:40 PM, Romain Francois <rom...@r-enthusiasts.com> wrote: > Le 08/09/10 06:07, Christian Gunning a écrit : >> >> Yes, I see the reinvent-the-wheel problem, especially after combing >> through rcpp-devel archives some more. I admit that I don't well >> understand the relative costs/benefits of extending the R proxy class >> versus outsourcing to Armadillo. Two examples that come to mind are >> Rcpp::Array and Rcpp::DataFrame. >> >> In the first case, could I conceivably turn an input 3D SEXP array >> into, e.g., NumericVector( Dimension(2,3,4) ), create an arma::cube >> out of it, process it and return? > > I think so. I have not tried though ... have you ?
No, not yet. I just now went mucking about through the armadillo classes (and, by extension, the rcpp-devel archives) at Dirk's suggestion. >> In the second case, there's a column level but no row-level accessor >> for the DataFrame (that I could find), nor is there a mapping into >> Armadillo. I get the impression that DataFrame is more of a >> convenience class for *returning* data rather than processing it? > > Yes. It makes it easy to create a data frame and access it by column. > > We'd be open to extend the interface if you provide some sort of design of > the sort of code you'd want to write. Yeah, I apologize - I'm just at the edge of my experience here. I spent the last few days learning proper C++ OOP writing (as opposed to reading) in response to your earlier comment about references. I admit, templates are still magic to me. I guess I'm still curious about the fundamental design goals. RcppArmadillo allows us to easily use armadillo's rich object model, with a wealth of object-specific methods, e.g.: mat A = randu<mat>(5,10); mat B = ones<mat>(5,2); // at column 2, insert a copy of B; A.insert_cols(2, B); Personally, R's indexing is one of my favorite parts of the language (and C++ indexing my least). With this in mind, I've wondered about the possibility of rolling some sort of generic Index class that contains enough information to do (as above): A(aColIndex) = B; So, if the overall goal is Simple/Reads-more-like-C++, then it's a moot point. If something like this is worth doing, is it worth doing for a variety of Rcpp classes? I admit that i'm not entirely clear on the cost side of the "worth" equation here :) Christian > Romain > >> best, >> Christian >> >> On Tue, Sep 7, 2010 at 5:48 PM, Dirk Eddelbuettel<e...@debian.org> wrote: >>> >>> On 7 September 2010 at 17:26, Christian Gunning wrote: >>> | I was thinking about this today, and I wondered if getter/setter >>> | functions for NumericMatrix, along with MatrixIndex classes might make >>> | any sense, as opposed to sugar? Something like this: >>> | >>> | SEXP foo1( int n ){ >>> | NumericVector x(n); >>> | MatrixIndex i(1); // row index >>> | NumericMatrix xx(n,n) ; >>> | // possible to assign by row or column? >>> | for (i.index =0; i.index< n; i.index++) { >>> | xx.Setter(i) = zeros(n) ; >>> | } >>> | return(xx) >>> | } >>> | >>> | class MatrixIndex: >>> | { >>> | // use apply()'s convention of 1=row, 2=col >>> | // row/col specification is set on creation >>> | private: >>> | int m_rowcol; >>> | public: >>> | int index; >>> | MatrixIndex( int rowcol, int i=0) { >>> | m_rowcol = rowcol; >>> | index = i; >>> | } >>> | }; >>> >>> I have to admit that questions like this always leads to _numeric >>> classes_ >>> such as Armadillo or NewMat rather than our R proxy classes. Did you see >>> what Armadillo: http://arma.sourceforge.net/docs.html#insert_rows >>> >>> Would that help? Passing matrices from R via Rcpp to Armadillo (and >>> back) is >>> pretty easy. >>> >>> Cheers, Dirk >>> >>> PS We are a little behind wrapping Armadillo 0.9.70 in RcppArmadillo but >>> we >>> will get there "soon". >>> >>> >>> | best, >>> | Christian >>> | >>> | On Sun, Aug 22, 2010 at 5:23 AM, Romain Francois >>> |<rom...@r-enthusiasts.com> wrote: >>> |> Hello, >>> |> >>> |> There currently is no sugar facility to generate a matrix the way you >>> want. >>> |> The last option is probably the best thing to do for now. >>> |> >>> |> Perhaps outer can help you : >>> |> >>> |> NumericVector xx(x) ; >>> |> NumericVector yy(y); >>> |> NumericMatrix m = outer( xx, yy, std::plus<double>() ) ; >>> |> return m ; >>> |> >>> |> Romain >>> |> >>> |> Le 21/08/10 23:13, Christian Gunning a écrit : >>> |>> >>> |>> Dear list, >>> |>> >>> |>> I'm amazed at the ability to use the apply family in Rcpp. Yet I'm >>> still >>> |>> unsure of the best way to assign NumericVector objects into >>> |>> NumericMatrix objects. Must this be done element-by-element, or is >>> |>> there something equivalent to R's MyMatrix[,1] = MyColVector? >>> |>> (As an aside, are both mymatrix[i,j] and mymatrix(i,j) equivalent? >>> It >>> |>> seems that I've seen them used interchangably on the list.) >>> |>> >>> |>> A simple example of what I'm aiming for: >>> |>> Make an n*n matrix, and use sapply to perform a vector operation by >>> |>> row, here constructing a vector of length n full of zeros. >>> |>> >>> |>> // a simple vector-returning function >>> |>> NumericVector zeros( int n){ >>> |>> NumericVector ret(n); >>> |>> ret = 0; >>> |>> return ret; >>> |>> } >>> |>> >>> |>> // sapply version, doesn't work but is easy to read >>> |>> SEXP foo( int n ){ >>> |>> NumericVector x(n); >>> |>> x = n; >>> |>> NumericMatrix xx(n,n) ; >>> |>> // possible to assign by row or column? >>> |>> xx = sapply( x, zeros ) ; >>> |>> return(xx); >>> |>> } >>> |>> >>> |>> // the looped version, where xx[,i] is not syntactically valid >>> |>> SEXP foo1( int n ){ >>> |>> NumericVector x(n); >>> |>> int i; >>> |>> NumericMatrix xx(n,n) ; >>> |>> // possible to assign by row or column? >>> |>> for (i =0; i<n; i++) { >>> |>> xx[,i] = zeros(n) ; >>> |>> } >>> |>> return(xx) >>> |>> } >>> |>> >>> |>> >>> |>> // syntactically valid, element-wise assignment >>> |>> SEXP foo2( int n ){ >>> |>> NumericVector x(n); >>> |>> int i, j; >>> |>> NumericMatrix xx(n,n) ; >>> |>> // possible to assign by row or column? >>> |>> for (i=0; i<n; i++) { >>> |>> x = zeros(n) ; >>> |>> for (j=0; j<n; j++) { >>> |>> xx(i,j) = x[j] >>> |>> } >>> |>> } >>> |>> return(xx) >>> |>> } >>> |>> >>> |>> thanks so much, >>> |>> Christian Gunning >>> |>> -- >>> |>> A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama! >>> |> >>> |> -- >>> |> Romain Francois >>> |> Professional R Enthusiast >>> |> +33(0) 6 28 91 30 30 >>> |> http://romainfrancois.blog.free.fr >>> |> |- http://bit.ly/bzoWrs : Rcpp svn revision 2000 >>> |> |- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th >>> |> `- http://bit.ly/aAyra4 : highlight 0.2-2 >>> |> >>> |> >>> | >>> | >>> | >>> | -- >>> | A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama! >>> | _______________________________________________ >>> | Rcpp-devel mailing list >>> | Rcpp-devel@lists.r-forge.r-project.org >>> | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >>> >>> -- >>> Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com >>> >> >> >> > > > -- > Romain Francois > Professional R Enthusiast > +33(0) 6 28 91 30 30 > http://romainfrancois.blog.free.fr > |- http://bit.ly/bzoWrs : Rcpp svn revision 2000 > |- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th > `- http://bit.ly/aAyra4 : highlight 0.2-2 > > > -- A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama! _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel