I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)? Thanks.
[R-pkg-devel] How to pass a connection into a C function (R 3.2)
7 messages · Duncan Murdoch, Tom Quarendon
On 21/01/2016 11:39 AM, Tom Quarendon wrote:
I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch
But that's what I want to do, create the connection in R code and pass it on to the C function. My question is, how do I do that? You appear to need the C getConnection entry point, but it's not part of the API. So I'm wondering how I'm supposed to do what you describe. Sorry if I was unclear. Sent from my iPhone
On 21 Jan 2016, at 5:44 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
On 21/01/2016 11:39 AM, Tom Quarendon wrote: I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch
But that's what I want to do, create the connection in R code and pass it on to the C function. My question is, how do I do that? You appear to need the C getConnection entry point, but it's not part of the API. So I'm wondering how I'm supposed to do what you describe. Sorry if I was unclear. Sent from my iPhone
On 21 Jan 2016, at 5:44 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote: On 21/01/2016 11:39 AM, Tom Quarendon wrote: I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch
On 21/01/2016 12:50 PM, Tom Quarendon wrote:
But that's what I want to do, create the connection in R code and pass it on to the C function. My question is, how do I do that? You appear to need the C getConnection entry point, but it's not part of the API. So I'm wondering how I'm supposed to do what you describe.
Sorry, my advice was wrong. I remembered that we exposed code to create new connections, and assumed it had some code to work with them, but it doesn't. Duncan Murdoch
Sorry if I was unclear. Sent from my iPhone
On 21 Jan 2016, at 5:44 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote: On 21/01/2016 11:39 AM, Tom Quarendon wrote: I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch
So upshot is that I can only do why I want by using the function that's not part of the api, or just not using connections at all and just using normal C file io, opened from C, and simply pass the file name in instead, rather than a proper connection object?
On 21 Jan 2016, at 6:04 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
On 21/01/2016 12:50 PM, Tom Quarendon wrote: But that's what I want to do, create the connection in R code and pass it on to the C function. My question is, how do I do that? You appear to need the C getConnection entry point, but it's not part of the API. So I'm wondering how I'm supposed to do what you describe.
Sorry, my advice was wrong. I remembered that we exposed code to create new connections, and assumed it had some code to work with them, but it doesn't. Duncan Murdoch
Sorry if I was unclear. Sent from my iPhone
On 21 Jan 2016, at 5:44 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote: On 21/01/2016 11:39 AM, Tom Quarendon wrote: I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch
On 21/01/2016 1:07 PM, Tom Quarendon wrote:
So upshot is that I can only do why I want by using the function that's not part of the api, or just not using connections at all and just using normal C file io, opened from C, and simply pass the file name in instead, rather than a proper connection object?
You could also call R from C to do the I/O for you. Duncan Murdoch
On 21 Jan 2016, at 6:04 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
On 21/01/2016 12:50 PM, Tom Quarendon wrote: But that's what I want to do, create the connection in R code and pass it on to the C function. My question is, how do I do that? You appear to need the C getConnection entry point, but it's not part of the API. So I'm wondering how I'm supposed to do what you describe.
Sorry, my advice was wrong. I remembered that we exposed code to create new connections, and assumed it had some code to work with them, but it doesn't. Duncan Murdoch
Sorry if I was unclear. Sent from my iPhone
On 21 Jan 2016, at 5:44 pm, Duncan Murdoch <murdoch.duncan at gmail.com> wrote: On 21/01/2016 11:39 AM, Tom Quarendon wrote: I would like to implement a package that contains a C function that writes to a connection. So the R_ext/Connections.h defines what a connection IS, but not how to get one. What seems to work is to manually declare Rconnection getConnection(int n); In my C file, and while this works, and I can then use the connection object, it fails package validation with: ?Found non-API call to R: ?getConnection? Compiled code should not call non-API entry points in R.? So how am I supposed to do this? Is there a way? Or do I just live with the check warning (ideally not)?
The usual way to do that would be to create the connection in R code, and pass it in with your call. If you don't know what connection you need at the time you call your C code, you can evaluate an R expression from C to do the same, but this is relatively tricky, so I'd advise the other method. Duncan Murdoch