Hi,
I'm trying to understand (mostly from the R-exts manual) how to use
the callbacks declared in Rinterface.h. As a first attempt, I'm trying
to redefine ptr_R_WriteConsole in a very trivial manner. Here's my
code:
---------------
$ cat altr.c
int Rf_initialize_R(int ac, char **av);
#define R_INTERFACE_PTRS 1
#include <Rinterface.h>
extern int R_running_as_main_program;
static void my_R_WriteConsole(char *buf, int len)
{
printf("R<< %s", buf);
}
int main(int ac, char **av)
{
R_running_as_main_program = 1;
ptr_R_WriteConsole = my_R_WriteConsole;
Rf_initialize_R(ac, av);
Rf_mainloop();
return 0;
}
---------------
I compile and run this in bash with
RPROG=R
INC=`${RPROG} CMD config --cppflags`
LDF=`${RPROG} CMD config --ldflags`
export LD_LIBRARY_PATH=`${RPROG} RHOME`/lib
gcc -o altr ${INC} ${LDF} altr.c
${RPROG} CMD ./altr
However, my customized version seems not to be used. What am I missing?
-Deepayan
Hi Deepayan, IIRC Rf_initialize_R sets up the pointers so ptr_R_WriteConsole is just being overwritten by the original. You want to do it between initialization and the mainloop On 4/2/07, Deepayan Sarkar <deepayan.sarkar at gmail.com> wrote:> Hi, > > I'm trying to understand (mostly from the R-exts manual) how to use > the callbacks declared in Rinterface.h. As a first attempt, I'm trying > to redefine ptr_R_WriteConsole in a very trivial manner. Here's my > code: > > --------------- > $ cat altr.c > > int Rf_initialize_R(int ac, char **av); > > #define R_INTERFACE_PTRS 1 > #include <Rinterface.h> > > extern int R_running_as_main_program; > > static void my_R_WriteConsole(char *buf, int len) > { > printf("R<< %s", buf); > } > > int main(int ac, char **av) > { > R_running_as_main_program = 1; > ptr_R_WriteConsole = my_R_WriteConsole; > Rf_initialize_R(ac, av); > Rf_mainloop(); > return 0; > } > --------------- > > I compile and run this in bash with > > > RPROG=R > > INC=`${RPROG} CMD config --cppflags` > LDF=`${RPROG} CMD config --ldflags` > export LD_LIBRARY_PATH=`${RPROG} RHOME`/lib > gcc -o altr ${INC} ${LDF} altr.c > > ${RPROG} CMD ./altr > > However, my customized version seems not to be used. What am I missing? > > -Deepayan > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Byron Ellis (byron.ellis at gmail.com) "Oook" -- The Librarian
On Apr 2, 2007, at 8:51 PM, Deepayan Sarkar wrote:> Hi, > > I'm trying to understand (mostly from the R-exts manual) how to use > the callbacks declared in Rinterface.h. As a first attempt, I'm trying > to redefine ptr_R_WriteConsole in a very trivial manner. Here's my > code: > > --------------- > $ cat altr.c > > int Rf_initialize_R(int ac, char **av); > > #define R_INTERFACE_PTRS 1 > #include <Rinterface.h> > > extern int R_running_as_main_program; > > static void my_R_WriteConsole(char *buf, int len) > { > printf("R<< %s", buf); > } > > int main(int ac, char **av) > { > R_running_as_main_program = 1; > ptr_R_WriteConsole = my_R_WriteConsole; > Rf_initialize_R(ac, av); > Rf_mainloop(); > return 0; > } > --------------- > > I compile and run this in bash with > > > RPROG=R > > INC=`${RPROG} CMD config --cppflags` > LDF=`${RPROG} CMD config --ldflags` > export LD_LIBRARY_PATH=`${RPROG} RHOME`/lib > gcc -o altr ${INC} ${LDF} altr.c > > ${RPROG} CMD ./altr > > However, my customized version seems not to be used. What am I > missing? >1) see Byron's e-mail 2) by default R uses stdout/err connections instead of the console API, you need to disable that so the resulting code should look like this: Rf_initialize_R(ac, av); ptr_R_WriteConsole = my_R_WriteConsole; R_Outputfile = NULL; R_Consolefile = NULL; Rf_mainloop(); Cheers, Simon