On Tue, 18 Jul 2006, J?rn Schulz wrote:
>
> Hello at all !
>
> What is the correct form to give a list form R (e.g. list(c(-1,1),
> "TestFile") ) to C. I have no problems, if I don't use
character and I have
> also no problems to give a character vector form R to C. But, if I combine
> real and strings in a list then I don't know the correct syntax.
>
> I try it with following (an example):
>
> SEXP writeFile(SEXP headerR){
> Image *SaveImage;
>
> PROTECT(headerR = AS_VECTOR(headerR));
> SaveImage->Xmin = (float) REAL(VECTOR_ELT(headerR, 0))[0];
> SaveImage->Ymin = (float) REAL(VECTOR_ELT(headerR, 0))[1];
> strcpy(SaveImage->Description, CHAR(STRING_ELT(headerR, 1)));
> }
>
> where
>
> typedef struct {
> float Xmin;
> float Ymin;
> char Description[80];
> } Image;
>
> But with this form the characters are doesn't correct (in this case
> Description). Perhaps a problem is that I protect the list with AS_VECTOR.
> Or is it not possible to comitted a list from R to C that contain numeric
> values and characters ?
You intended the second element of the list, so you need
CHAR(STRING_ELT(VECTOR_ELT(headerR, 1), 0)))
that is X[[2]][1], not X[1] (assuming X to be a character vector).
[This is all in `Writing R Extensions', with examples. The R-devel
version of R would have given you an informative warning about the misuse
of SET_VECTOR_ELT.]
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595