Skip to content

R callbacks

5 messages · Byron Ellis, Simon Urbanek, Deepayan Sarkar +1 more

#
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:

  
    
#
On Apr 2, 2007, at 8:51 PM, Deepayan Sarkar wrote:

            
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
#
On 4/3/07, Simon Urbanek <simon.urbanek at r-project.org> wrote:
Thanks, setting things to NULL was the critical piece (I had tried
Byron's suggestion myself). A note mentioning this in R-exts would be
helpful.

-Deepayan
#
On Tue, 3 Apr 2007, Deepayan Sarkar wrote:

            
Done for 2.5.0.