[R] More questions about R extension programming
Thomas Lumley
tlumley at u.washington.edu
Sat Oct 4 15:32:19 CEST 2003
On Fri, 4 Oct 2003, Rajarshi Guha wrote:
> On Fri, 2003-10-03 at 17:01, Rajarshi Guha wrote:
> > Hi,
> > I'm using a package that has a number of formats. I have C code to
> > parse these formats the results of which are generally integer arrays.
> >
> > I would like to utilize these modules in R rather than writing R code to
> > read in these files (and also to learn about R extensions).
>
> Thanks for the pointers to the above question. I have a few more!
>
> 1) I would like my C function to be passed a character string. Thus I
> define the function as
>
> SEXP _loadsets(SEXP filename)
> {
> FILE *f;
>
> PROTECT(filename = AS_CHARACTER(filename));
> f = fopen(filename,"r");
> UNPROTECT(1);
> .....
> .....
> }
>
> However compiling it gives me:
>
> loadset.c: In function `_loadsets':
> loadset.c:25: warning: passing arg 1 of `fopen' from incompatible
> pointer type
> gcc -shared -L/usr/local/lib -o loadset.so loadset.o
>
> How can I coerce/convert the SEXP type to a char*?
Your code can't possibly be right, because it defined filename as SEXP and
passes it to a function that accepts const char *.
You want
fopen(CHARACTER(STRING_ELT(filename,0)), "r")
Since filename is a vector of strings (with one element) you need
STRING_ELT to extract one of the strings. Now you have a SEXP and need
CHARACTER() to extract a pointer to the actual chars, just as I used
INTEGER() to extract a pointer to the actual ints in an integer vector
SEXP.
> 2) The function returns a list object whose elements themselves are
> lists.
No. It returns a list whose elements are integer vectors.
> Is there any way I can make those elements arrays rather than
> lists?
It's probably easiest to do this manipulation in R afterwards
>
> 3) I'm a little puzzled since I allocate a list (say length = 2) object
> by
>
> alist = allocVector(VECSXP,2);
>
> and use the same syntax for a vector object. From what I understand a
> vector is the same as a list. Is this true?
No (or yes, but not in the way you mean). A list contains vectors or
lists as elements. A vector contains numbers or strings. The first
element to allocVector says what sort of thing you are allocating.
> 4) When writing C code does it make sense to differentiate between a
> list object and an array object? Or is it better to simply coerce the
> returned list objects (via as.array()) from within R.
It is often but not always sensible to do all the manipulation of
complicated attributes in R. I think you mean array(), not as.array().
-thomas
Thomas Lumley Assoc. Professor, Biostatistics
tlumley at u.washington.edu University of Washington, Seattle
More information about the R-help
mailing list