[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;
      case 2:
	  for (i = 0; i < nr; i++)
	      for (j = 0; j < nc; j++)
		  INTEGER(ans)[i + j * nr] = j + 1;
      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

More information about the R-help mailing list