Jean Meloche
Tue, 02 Feb 1999 20:38:35 +0000

I have to write extensions to R regularly.

One of them was an interface to a mysql database on a
different computer. The best way to do that is to have
something like

mysql<-function (dbname, host = "zap", user = "nobody", password = "ok") 
    handle <<- .RC("mysqlconnect", c(host, user, password, dbname))


query<-function (cmd) 
    .RC("mysqlquery", handle, cmd)

In other words, my mysql (written in C) functions return a true R object.
The .RC function above simply calls the C funtion, passing R objects as
arguments and returns the R object created within the C function.

I think that R should give the ability to write C functions that build
R objects. Eventually, it would be best to have an API to standardize
the process of building R object too...

I'd like to see .RC added to the standard R distribution. Right now, I'm
applying my patch every time I upgrade R. Here is my diff

diff -r R-0.63/src/main/dotcode.c R-0.63.orig/src/main/dotcode.c
< SEXP do_dotRCode(SEXP call, SEXP op, SEXP args, SEXP env)
< {
<       DL_FUNC fun;
<       char buf[128], *p, *q, *vmax;
<       SEXP retval;
<       vmax = vmaxget();
<       op = CAR(args);
<       if (!isString(op)) errorcall(call,"function name must be a string\n");
<       /* make up load symbol & look it up */
<       p = CHAR(STRING(op)[0]);
<       q = buf; while ((*q = *p) != '\0') { p++; q++; }
<       if (!(fun=R_FindSymbol(buf))) errorcall(call,
<               "C-R function not in load table\n");
<       retval=fun(args);
<       vmaxset(vmax);
<       return retval;
< }
<       }
>         }
diff -r R-0.63/src/main/names.c R-0.63.orig/src/main/names.c
< {".RC",         do_dotRCode,    0,      1,      -1,     PP_FOREIGN},
diff -r R-0.63/src/main/names.h R-0.63.orig/src/main/names.h

If it is of interest, I could also provide the module that implements
the mysql interface.

Many thanks.

Jean Meloche
r-devel mailing list -- Read
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: