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 callbacks
5 messages · Byron Ellis, Simon Urbanek, Deepayan Sarkar +1 more
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
On 4/3/07, Simon Urbanek <simon.urbanek at r-project.org> wrote:
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();
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:
On 4/3/07, Simon Urbanek <simon.urbanek at r-project.org> wrote:
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();
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.
Done for 2.5.0.
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595