Re: [Rd] Question about copying arguments in C.

From: Simon Urbanek <simon.urbanek_at_r-project.org>
Date: Sat, 15 Sep 2012 08:40:29 -0400

On Sep 14, 2012, at 11:10 PM, Simon Knapp wrote:

> Hi List,
>
> I'd imagine this is a question that has been answered before, but I
> can't seem to track it down, sorry for the duplication if it has.
>
> I am writing an interface for a C library and want to return an S4
> class from the 'constructing' method. One of the slots of the argument
> to be returned will be filled with one of the arguments passed to the
> function. My question is about whether I can directly pass arguments
> to the function directly to slots of the returned object (or to a
> return value more generally for that matter), or whether I have to
> copy them. If it is the latter, then how may I do this. The question
> is phrased in the following (simplified) code.
>
> int constructThingy(int thingysInteger);
>
> SEXP constructThingy(SEXP thingysInteger) {
> SEXP ans, TClass, ti;
> if(!isInteger(thingysInteger)) error("thingysIntegermust be an integer.");
> if(constructThingy(INTEGER(thingysInteger)[0])) error("error in
> getting a thingy");
> TClass = MAKE_CLASS("thingy");
> PROTECT(ans = NEW_OBJECT(TClass));
>
>
> // *****QUESTION STARTS HERE*****
> // CAN I SAY:
> SET_SLOT(ans, Rf_install("myInteger"), thingysInteger);
>
> // IF NOT, CAN I SAY
> SET_SLOT(ans, Rf_install("myInteger"), AS_INTEGER(thingysInteger));
>
> // OR DO I NEED TO SAY
> PROTECT(ti = allocVector(INTSXP, 1)); INTEGER(pns)[0] =
> INTEGER(thingysInteger)[0];
> SET_SLOT(ans, Rf_install("myInteger"), ti);
> // *****END OF QUESTION*****
>
> UNPROTECT(1); // or UNPROTECT(2) in latter case.
> return ans;
> }
>
>
>
> I think this is the same as asking whether the following is OK:
>
> SEXP func(SEXP arg) {
> return arg;
> }
>

Yes.

In fact if you wanted to duplicate (e.g, if you want to modify an incoming argument and return the modified result), the proper way would be to use duplicate() and not the contortions your were trying.

Cheers,
Simon

>
>
>
>
> Thanks in advance,
> Simon
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sat 15 Sep 2012 - 12:43:40 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 15 Sep 2012 - 17:30:43 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive