[prev in list] [next in list] [prev in thread] [next in thread]
List: r-devel
Subject: Re: [Rd] Dealing with R list objects in C/C++
From: Martin Morgan <mtmorgan () fhcrc ! org>
Date: 2011-01-27 21:16:51
Message-ID: 4D41E0C3.5070902 () fhcrc ! org
[Download RAW message or body]
On 1/27/2011 1:03 PM, Wayne.Zhang@barclayscapital.com wrote:
> Many thanks for the quick reply Martin, your code works as expected. Next I'd like \
> to retrieve heterogeneous data from an SEXP object (let's just pretend it's the \
> same type as the one what I'm constructing). I'm sure the relevant APIs are \
> defined in Rinternals.h, do we have API documentations for this header file \
> somewhere?
Hi Wayne -- Your best bet might be sections 5 and 6 of
RShowDoc("R-exts")
or the books Dirk mentioned; see also Rdefines.h. Martin
> @Dirk: thanks for your help too. I'm doing something very simple at the moment, so \
> I prefer not to bring in Rinside/Rcpp if possible.
> Thanks again,
> Wayne
>
>
> -----Original Message-----
> From: Martin Morgan [mailto:mtmorgan@fhcrc.org]
> Sent: Wednesday, January 26, 2011 10:04 PM
> To: Zhang, Wayne: IT (NYK)
> Cc: r-devel@r-project.org
> Subject: Re: [Rd] Dealing with R list objects in C/C++
>
> On 01/26/2011 02:56 PM, Wayne.Zhang@barclayscapital.com wrote:
> > Hi,
> >
> > I'd like to construct an R list object in C++, fill it with relevant data, and \
> > pass it to an R function which will return a different list object back. I have \
> > browsed through all the R manuals, and examples under tests/Embedding, but can't \
> > figure out the correct way. Below is my code snippet:
> > #include<Rinternals.h>
> > // Rf_initEmbeddedR and other setups already performed
> >
> > SEXP arg, ret;
> >
> > // this actually creates a pairlist. I can't find any API that creates a list
> > PROTECT(arg = allocList(3));
> Allocate a list of length 3 via SEXPTYPE VECSXP
>
> PROTECT(arg = allocVector(VECSXP, 3));
>
> > // I want the first element to be type integer, second double, and third a \
> > vector. INTEGER(arg)[0] = 1; //<- runtime exception: "INTEGER() can \
> > only be applied to a 'integer', not a 'pairlist'
> set the first element of the list to an integer vector of length 1, and
> assign a value
>
> SET_VECTOR_ELT(arg, 0, allocVector(INTSXP, 1));
> INTEGER(VECTOR_ELT(arg, 0))[0] = 1
>
> or more succinctly
>
> SET_VECTOR_ELT(arg, 0, ScalarInteger(1));
>
> > REAL(arg)[1] = 2.5; // control never reached here
> and the second element
>
> SET_VECTOR_ELT(arg, 1, ScalarReal(2.5));
>
> > VECTOR_PTR(arg)[2] = allocVector(REALSXP, 4);
> and for the third allocate a REALSXP and then fill
>
> SET_VECTOR_ELT(arg, 2, allocVector(REALSXP, 4));
>
> next lines should be ok as REAL(VECTOR_ELT(arg, 2))[0] = 10.0; or with
> less typing as
>
> double *x = REAL(VECTOR_ETL(arg, 2));
> x[0] = 10.0; x[1] = 11.0; x[2] = 12.0; x[3] = 13.0;
>
> > REAL(VECTOR_PTR(arg)[2])[0] = 10.0;
> > REAL(VECTOR_PTR(arg)[2])[1] = 11.0;
> > REAL(VECTOR_PTR(arg)[2])[2] = 12.0;
> > REAL(VECTOR_PTR(arg)[2])[3] = 13.0;
> >
> > PROTECT(call = lang2(install(entryPoint.c_str()), arg));
> not sure where entryPoint.c_str() is coming from, but
>
> PROTECT(call = lang2(install("fun"), arg));
>
> with some debate about whether install("fun") should be PROTECT'ed.
>
> > ret = R_tryEval(call, R_GlobalEnv,&errorOccurred);
> likely PROTECT(ret = ...) while checking errorOccurred, etc.
>
> Hope that helps,
>
> Martin
>
> >
> > I'll be grateful if you can point me to any online docs/samples.
> >
> > Thanks in advance,
> > Wayne
> >
> > _______________________________________________
> >
> > This e-mail may contain information that is confidential, privileged or otherwise \
> > protected from disclosure. If you are not an intended recipient of this e-mail, \
> > do not duplicate or redistribute it by any means. Please delete it and any \
> > attachments and notify the sender that you have received it in error. Unless \
> > specifically indicated, this e-mail is not an offer to buy or sell or a \
> > solicitation to buy or sell any securities, investment products or other \
> > financial product or service, an official confirmation of any transaction, or an \
> > official statement of Barclays. Any views or opinions presented are solely those \
> > of the author and do not necessarily represent those of Barclays. This e-mail is \
> > subject to terms available at the following link: www.barcap.com/emaildisclaimer. \
> > By messaging with Barclays you consent to the foregoing. Barclays Capital is the \
> > investment banking division of Barclays Bank PLC, a company registered in England \
> > (number 1026167) with its registered o!
ff
> i!
> > ce at 1 Churchill Place, London, E14 5HP. This email may relate to or be sent \
> > from other members of the Barclays Group. \
> > _______________________________________________
> > [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
Dr. Martin Morgan, PhD
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic