# [R] Passing an R matrix to a C program

Martin Maechler maechler at stat.math.ethz.ch
Thu Sep 27 15:26:37 CEST 2001

```>>>>> "AgusL" == Agustin Lobo <alobo at ija.csic.es> writes:

AgusL> Hello,

AgusL> I'm starting to write a C function that gets
AgusL> a list and a matrix from R. I'm using .Call
AgusL> because I've undertood that this is recommended
AgusL> to handle lists (am I wrong?).  My problem is that I
AgusL> can pass the matrix as a vector, but not as a 2D array.

Yes, they are vectors in one sense, the main reason being that C does not
have really have 2D arrays [another reason being that Fortran has this
equivalence by definition].
The example you give is just a typical implementation of matrices in C,
but AFAIK not at all the most common one for numerical computation.

The R functions row() and col()  call the following C function
(from src/main/array.c) which should you how to deal with arrays:

---------------------------------------------------------------
SEXP do_rowscols(SEXP call, SEXP op, SEXP args, SEXP rho)
{
SEXP ans;
int i, j, nr, nc;

if (length(args) != 1)
error("incorrect number of args to row/col");
if (!isMatrix(CAR(args)))
error("a matrix is required as arg to row/col");

nr = nrows(CAR(args));
nc = ncols(CAR(args));

ans = allocMatrix(INTSXP, nr, nc);

switch (PRIMVAL(op)) {
case 1:
for (i = 0; i < nr; i++)
for (j = 0; j < nc; j++)
INTEGER(ans)[i + j * nr] = i + 1;
break;
case 2:
for (i = 0; i < nr; i++)
for (j = 0; j < nc; j++)
INTEGER(ans)[i + j * nr] = j + 1;
break;
}
return ans;
}
---------------------------------------------------------------

For that case (and in others), people may like to use C macros, e.g.,

#define ANS(I_,J_)  INTEGER(ans)[I_ + J_ * nr]

would allow you to have

ANS(i,j) = i + 1;
...
ANS(i,j) = j + 1;

in the above function.
But note that this macros relies on `nr' being defined and having the
correct value.  One reason we tend not to use them.

Martin Maechler <maechler at stat.math.ethz.ch>	http://stat.ethz.ch/~maechler/
Seminar fuer Statistik, ETH-Zentrum  LEO D10	Leonhardstr. 27
ETH (Federal Inst. Technology)	8092 Zurich	SWITZERLAND
phone: x-41-1-632-3408		fax: ...-1228			<><
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```