I'd like to be able to read from an arbitrary R connection (in the sense of ?connections
), which would be passed to an R function by the user and then down into some C code via .Call
.
The R API, in file R_ext/Connections.h
, specifies a function, R_ReadConnection
, which takes a pointer to an Rconn
struct as its first argument, and does what I want. The struct itself is also defined in that header, but I see no way of retrieving a struct of that type, aside from getConnection
(the C function), which is not part of the API. As far as I can tell, the external pointer associated with the connection also does not point to the struct directly.
So, could anyone please tell me whether there is a supported way to convert a suitable SEXP
to a pointer to the associated Rconn
struct?
Thanks in advance.
The R API function R_GetConnection()
was added in R 3.3.0. It performs the conversion from SEXP
to pointer to Rconn
(a.k.a. Rconnection
). Hence, the solution is now
#include <R_ext/Connections.h>
SEXP myfunction (SEXP conn_)
{
Rconnection conn = R_GetConnection(conn_);
// Do something with the connection
return R_NilValue;
}
This was documented in NEWS
:
R_GetConnection() which allows packages implementing connections to convert R connection objects to Rconnection handles. Code which previously used the low-level R-internal getConnection() entry point should switch.
I don't think there is (this is an oversight, I think). The workaround is to declare an appropriate prototype and use it
Rconnection getConnection(int n);
SEXP connect_me(SEXP conn) {
getConnection(INTEGER(conn)[0]);
return R_NilValue;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With