Hi All, I am confused by a type conversion happening against my intent. In an R script I allocate a matrix X, and I pass it to a C function by using tmp -< .C(..., as.double(X),...). I use as.double() because I read that it makes sure that the parameter passing is correct. I return the matrix from the R script using: return (list(..., X = tmp$X, ...)) The returned value is not a matrix but a flat vector. I must not understand something fundamental that is happening here. Should I remove the as.double() from the .C() call? Here is what I am trying to do: allocate a matrix (with doubles) that is modified by the .C() call and return it from the script. I am also not sure how to make sure that the allocated matrix is made up of double values. If I use diag(n) to initialize it will that do the trick? Thanks! -Matyas [[alternative HTML version deleted]]
On Sun, Mar 04, 2012 at 03:18:33PM -0600, Matyas Sustik wrote:> Hi All, > > I am confused by a type conversion happening against my intent. > > In an R script I allocate a matrix X, and I pass it to a C function > by using > > tmp -< .C(..., as.double(X),...). > > I use as.double() because I read that it makes sure that the > parameter passing is correct. > > I return the matrix from the R script using: > > return (list(..., X = tmp$X, ...)) > > The returned value is not a matrix but a flat vector. > > I must not understand something fundamental that is happening > here.Hi. No, this is correct. See section 5.2 Interface functions .C and .Fortran in R-exts.pdf for the list of C types. There is int * and double *, which are vectors. Your R code should restore the dim attribute after the return from C code, for example using matrix() with appropriate nrow and ncol parameters. If you want to pass really a matrix, use .Call, which is more powerful. Hope this helps. Petr Savicky.
-------- Original message -------- Subject: type conversion Date: Sun Mar 04 15:18:33 CST 2012 From: Matyas Sustik <msustik@gmail.com> To: r-help@r-project.org I got it. Just documenting it on the list. I need do: dim(tmp$X) <- c(n, k) return (list(..., X = tmp$X, ...)) -Matyas [[alternative HTML version deleted]]