[Rd] Passing externalptr to .C()
Rick Sayre
whorfin at pixar.com
Fri May 11 23:20:13 CEST 2012
Greetings.
2.15.0 added this behavior
http://developer.r-project.org/blosxom.cgi/R-devel/NEWS/2012/03/29#n2012-03-29
o Passing R objects other than atomic vectors, functions, lists and
environments to .C() is now deprecated and will give a warning.
Most cases (especially NULL) are actually coding errors. NULL
will be disallowed in future.
This seems to make sense, except that this case includes externalptrs.
I have quite a bit of code, designed to interface with various
external hardware devices, which uses this sort of idiom:
# for example
getDeviceInfo <- function(handle) {
.C("groovyDevice_getDeviceInfo", PACKAGE="groovyDevice",
handle,
status = as.integer(0))[-1] # skip handle
}
where "handle" was the result of a .Call to a routine which
returned a SEXP which was the result of a R_MakeExternalPtr() call
The "c" routine looked like:
void
groovyDevice_getDeviceInfo(SEXP handle, int *status)
{
groovyHandle *gh = R_ExternalPtrAddr(handle);
*status = GroovyStatus(gh);
}
This all used to work fine. As of 2.15.0, I now get this:
Warning message:
In getDeviceInfo() :
passing an object of type 'externalptr' to .C (arg 1) is deprecated
Passing the same handle to a .Call() does [of course] work fine.
I thought my usage was exactly as designed. How then should I be
passing an externalptr to a .C() call?
Cheers
More information about the R-devel
mailing list