From bates at stat.wisc.edu  Fri Jul 30 16:20:15 2004
From: bates at stat.wisc.edu (Douglas Bates)
Date: Fri Jul 30 16:16:53 2004
Subject: [Rd] existence of easy example of .Call??
In-Reply-To: <950E0EFCFDB083468E2A8BBC812E5E98954FBD@seludsmsx02.selu.astrazeneca.net>
References: <950E0EFCFDB083468E2A8BBC812E5E98954FBD@seludsmsx02.selu.astrazeneca.net>
Message-ID: <410A591F.7070909@stat.wisc.edu>

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.


[Rd] existence of easy example of .Call??
Douglas Bates