Freja.Vamborg@astrazeneca.com
2004-Jul-30 14:08 UTC
[Rd] existence of easy example of .Call??
Dear R-develers, I have been seraching in vain for an example of source-code, using .Call, to call an R-function from within C. Am also wondering i this .Call command works for all functions, say if I write a function analyse<-function() within my R functoin, can this function be called by the c-code called later in the same function. Eg, my.function<-function(){ ... analyse<-function() {} result<-.Call("My.c.code",...) } I then want My.c.code to call, analyse.. I have read the R-extension manual, but am just wondernig if anyone has another example of use of .Call, which may be more clear to a beginning user. Many thanks in advance, Freja
Freja.Vamborg@astrazeneca.com wrote:> Dear R-develers, > > I have been seraching in vain for an example of source-code, using .Call, to > call an R-function from within C. > Am also wondering i this .Call command works for all functions, say if I > write a function analyse<-function() > within my R functoin, can this function be called by the c-code called later > in the same function. > > Eg, > > my.function<-function(){ > ... > > analyse<-function() {} > > result<-.Call("My.c.code",...) > } > > I then want My.c.code to call, analyse.. > > I have read the R-extension manual, but am just wondernig if anyone has > another example of use of .Call, which may be more clear to a beginning > user.This is not as simple as it may seem it should be. There are a lot of details hidden from you when you evaluate a function call in R. These details are not hidden from you when you evaluate an R function call in C. You must create an SEXP of the function call with the correct number of arguments, populate the argument list with pointers to the actual values of the arguments, eval the function call, and extract the values from the resulting SEXP. Of course you need to remember to PROTECT and UNPROTECT the function call and the result when working with them. In most cases there is another intermediate step in that you pass a character vector containing the name of the function through .Call and you must do the equivalent of the R function call get("My.R.function") inside your C code so that you can create the function call. If you really think that you want to embark on this you could find some examples in $(R-SRC)/src/library/stats/src/nls.c If you know that the R function call is eventually going to call another C function it is often easier to short-circuit the process and call the other C function directly from within your C code.
On Fri, 30 Jul 2004 Freja.Vamborg@astrazeneca.com wrote:> Dear R-develers, > > I have been seraching in vain for an example of source-code, using .Call, to > call an R-function from within C. > Am also wondering i this .Call command works for all functions, say if I > write a function analyse<-function() > within my R functoin, can this function be called by the c-code called later > in the same function. >There are examples using .C rather than .Call (for backwards compatibility) in the survival package. The calls to R are in cox_Rcallback.c and surv_callback.c -thomas