[Rd] declarations in non-exported headers and embedding R

Joe Conway mail at joeconway.com
Sun Aug 24 10:50:42 MEST 2003


I've been using R embedded in PL/R (R procedural language handler for 
PostgreSQL, http://www.joeconway.com/plr/) very successfully for several 
months now. A sincere "thank you" goes to the R development team for 
such a great product.

I have a question I'm hoping someone here can help me with. In order to 
get the required functionality out of PL/R, I've had to resort to using 
some defines and declarations that are only available in non-exported 
headers. There is precedent, of a sort, for most of what I've used in 
the tests/Embedding source. Below I'll present the header code I've 
used, where it comes from, why I've used it, and where I saw it used in 

My question is whether there is equivalent exported functionality that 
I'm missing? Or if not, would a patch be accepted that moves this 
functionality to an exported header?



Here are the specifics:
 From non-exported header file ${R_HOME}/src/include/Parse.h
extern SEXP R_ParseVector(SEXP, int, int *);
#define PARSE_NULL			0
#define PARSE_OK			1
#define PARSE_ERROR			3
#define PARSE_EOF			4
 From non-exported header file ${R_HOME}/src/include/Defn.h
extern void R_PreserveObject(SEXP);
extern void R_ReleaseObject(SEXP);

The first time a PL/R function is called, the R function is built and 
parsed using R_ParseVector(), then cached for subsequent calls. Without 
R_PreserveObject() garbage collection destroys the object while PL/R is 
still trying to use it. R_ReleaseObject() is needed to release the 
object for garbage collection if the cached copy becomes invalid.

Similar use of R_ParseVector() found in
Similar use of R_PreserveObject() found in

from non-exported header file ${R_HOME}/src/include/Startup.h
/* Startup Actions */
typedef enum {
     SA_NORESTORE,/* = 0 */
     SA_DEFAULT,/* was === SA_RESTORE */
from non-exported header file ${R_HOME}/src/unix/Runix.h
extern void Rstd_CleanUp(SA_TYPE saveact, int status, int runLast);

When the PostgreSQL backend process exits, Rstd_CleanUp() is called via 
registered onexit callback so that the embedded R interpreter can clean 
up (e.g. to remove the created Rtmp[pid] directory).

Similar use found in ${R_HOME}/tests/Embedding/Rerror.c

More information about the R-devel mailing list