[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