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