On Mon, Mar 05, 2012 at 09:29:51AM +0000, Prof Brian Ripley wrote: > On 04/03/2012 22:26, Petr Savicky wrote: > >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. > > 'No, this is not correct'. If you want to use a double matrix in .C or > .Fortran, use > > storage.mode(X) <- "double" > > There are quite a few examples in R's own code, e.g. lm.fit.
Thank you for correction. I was not aware of this. storage.mode(X) <- "double" tmp <- .C(..., X=X,...) guarantees the correct type and keeps the dim attribute in tmp$X. Petr Savicky. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.