Sigal Blay wrote:

Thanks Sundar - but how do I return several vector objects of different modes wrapped in a list object using .Call?

Sigal



Have you looked at the documentation as I suggested? It's there in Section 4.8 of "Writing R Extensions". Take a look at the examples for "lapply" or look at Rdefines.h and Rinternals.h in the src/include directory.

You're lucky I have an already worked example I have used for myself in the past which I include below.

/* junk.c */
#include <R.h>
#include <Rdefines.h>

SEXP junk(SEXP n) {
  SEXP *p_b, *p_nm;
  SEXP val, a, b, c, val_nm;
  double *p_a;
  int *p_c;
  int i, len, val_len;
  char *nm[3] = {"numeric", "character", "integer"};
  char *LETTERS[26] = {"A", "B", "C", "D", "E", "F",
                       "G", "H", "I", "J", "K", "L",
                       "M", "N", "O", "P", "Q", "R",
                       "S", "T", "U", "V", "W", "X",
                       "Y", "Z"};
  val_len = 3;
  len = INTEGER_VALUE(n);
  PROTECT(val = allocVector(VECSXP, val_len));
  PROTECT(a = NEW_NUMERIC(len));
  PROTECT(b = NEW_CHARACTER(len));
  PROTECT(c = NEW_INTEGER(len));
  PROTECT(val_nm = NEW_CHARACTER(val_len));
  p_a = NUMERIC_POINTER(a);
  p_b = CHARACTER_POINTER(b);
  p_c = INTEGER_POINTER(c);
  p_nm = CHARACTER_POINTER(val_nm);
  for(i = 0; i < len; i++) {
    p_a[i] = 1/(double)(i + 1);
    p_b[i] = mkChar(LETTERS[i % 26]);
    p_c[i] = i + 1;
  }
  for(i = 0; i < val_len; i++)
    p_nm[i] = mkChar(nm[i]);
  SET_VECTOR_ELT(val, 0, a);
  SET_VECTOR_ELT(val, 1, b);
  SET_VECTOR_ELT(val, 2, c);
  setAttrib(val, R_NamesSymbol, val_nm);
  UNPROTECT(5);
  return val;
}

/* ## in R                                  */
/* dyn.load("junk")                         */
/* junk <- function(n = 1) .Call("junk", n) */
/* junk(4)                                  */


--sundar

______________________________________________
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to