Patrick, On Dec 28, 2011, at 12:07 AM, Patrick Leyshock wrote:
> I have an external pointer object that I'd like to pass from my R code to > some C code. Per Section 5.13 of "Writing R Extensions", I've noted that > "external pointers should only be used as part of an object with normal > semantics, for example an attribute or an element of a list." So I've > written up a workable C function as such: > > SEXP my_c_function(SEXP param) { > SEXP temp = getAttrib(param, install("ptr_attribute")); > void * ptr = R_ExternalPtrAddr(temp); > ... // do useful things with ptr > } > > I can pass my_c_function() an object with "normal" semantics (such as an > integer vector), where the external pointer object is a parameter named > "ptr_attribute". The function extracts the pointer object from param; i.e. > this function does what I want it to do. > > My question is: is there a way to do this using the .C() interface, rather > than .Call()? No. Why would you want to do that? .C is slower and mostly for backwards-compatibility. You can't pass anything complex with .C and the docs recommend .Call for this. The whole point of .C was to bypass R API but in your case you need it to get the pointer. > Using call_R seems a possibility - has anyone had luck > going this route? > call_R has nothing to do with this, it is sort of the equivalent of using the restricted set of objects to evaluate R function (so you still can't pass your pointer). As the docs say there is no point in using it in modern code. Cheers, Simon > Any suggestions appreciated. > > Thanks, Patrick > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel