[R] type conversion

Petr Savicky savicky at cs.cas.cz
Mon Mar 5 11:56:07 CET 2012


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.



More information about the R-help mailing list