From simon.urbanek at r-project.org  Tue Jun 19 18:38:43 2012
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Tue, 19 Jun 2012 12:38:43 -0400
Subject: [Rd] R and C pointers
In-Reply-To: <CAJ=0CtA6hHQpuhZUQ2iEJ40hthE-5FXx1idCjCECitzBVze=Qw@mail.gmail.com>
References: <CAJ=0CtA6hHQpuhZUQ2iEJ40hthE-5FXx1idCjCECitzBVze=Qw@mail.gmail.com>
Message-ID: <81332E89-93D2-47F2-A325-57A3BE2F57CE@r-project.org>


On Jun 19, 2012, at 11:40 AM, Adrian Du?a wrote:

> Dear R devel,
> 
> Apologies for these (most probably trivial) questions, doing my first
> attempt to call C from R (and actually learning C in the process).
> 
> I need to pass a matrix to C, and after reading R-exts.pdf (many
> times), I was unable to find how to handle matrices at C-level...
> except for, what probably is the answer, that matrices are in fact
> vectors with dimensions.
> 
> This is a sample code I am using at C level:
> ????????????????????????
> # include <R.h>
> # include <Rinternals.h>
> # include <R_ext/Rdynload.h>
> 
> SEXP foo(SEXP x) {
>    SEXP dimx;
>    double *px, *pdimx;
> 
>    PROTECT(dimx = getAttrib(x, R_DimSymbol));
>    px = REAL(x);
>    UNPROTECT(1);
>    return(dimx);
> }
> ????????????????????????
> 
> The question is: how to create pointers to dimx (in order to extract
> individual values)?
> 
> I tried:
> pdimx = REAL(dimx);
> 
> This is where R complains that:
> REAL() can only be applied to a 'numeric', not a 'integer'
> 

And it is right - dimensions are integers, not reals, you want

int *pdimx = INTEGER(dimx);

You can use REAL() only on real vectors, not on anything else.


> Much in the same line, what would be the procedure to create pointers
> to a logical vector y?
> I tried:
> PROTECT(y = coerceVector(y, LGLSXP));
> py = REAL(y);
> 
> where R throws a similar error.
> 

Obviously, you want

Rboolean *py = LOGICAL(y);

Cheers,
Simon


> Thanks very much in advance,
> Adrian
> 
> -- 
> Adrian Dusa
> Romanian Social Data Archive
> 1, Schitu Magureanu Bd.
> 050025 Bucharest sector 5
> Romania
> Tel.:+40 21 3126618 \
>        +40 21 3120210 / int.101
> Fax: +40 21 3158391
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] R and C pointers
Simon Urbanek