Skip to content

change function's formals default values

5 messages · Andrew Finley, Thomas Lumley

#
Hello,

I'm passing a user defined function into my c code. Once this function
is in my c code, I'd like to iteratively change the values associated
with the parameters defined in the function's formal list then evaluate
the function using these newly set defaults (i.e., using lang1(fn)).

My question is, how do I simply change the value associated with each
parameter in this function's formal list. I have messed around with the
SET_FORMAL function but can't figure out how to change these values.

Thanks-

Andrew
#
On Mon, 3 Apr 2006, Andrew Finley wrote:

            
<recoils in horror>

Are you *sure* you want to do this?  It seems that you should be able to 
use lexical scope to store this information in variables rather than 
default arguments and then you can use setVar to change the variables 
rather than changing the formals.

 	-thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle
#
Hi Thomas, 

Thanks for the note. I'm not sure about a lot of things. Setting the
formal defaults then calling the function seem straight forward.  I just
assumed it would be like setting list values, or the C equivalent of
calling formals(fn)<-list(a=1, b=3).

Following your suggestion, I can get the names of the parameters used in
this user defined function, but am not sure how to do what you are
suggesting. For instance, how do I call the function after I use setVar.
Could you point me to an example?

Thanks again!

Andrew
On Tue, 2006-04-04 at 07:21 -0700, Thomas Lumley wrote:
#
On Tue, 4 Apr 2006, Andrew Finley wrote:

            
##In R
f<-function(a,b){
   function(x){ a+b*x}
}

f23<-f(a=2,b=3)

dyn.load("cfun.so")
.Call("cfun",fun=f23,rho=environment(f23),x=c(1,2,3,4),newa=1,newb=2)

## in cfun.c

#include "Rinternals.h"

SEXP cfun(SEXP fun, SEXP rho, SEXP x, SEXP newa, SEXP newb){
       SEXP ans, funcall;

       setVar(install("a"), newa, rho);
       setVar(install("b"), newb, rho);

       PROTECT(funcall=lang2(fun,x));
       ans=eval(funcall,rho);

       UNPROTECT(1);
       return ans;

}

##

This isn't necessarily any simpler, but it seems more natural to modify 
variables than default arguments, and also it is probably safer since you 
don't have to worry about the value of NAMED() and whether to copy the 
arguments.

This is based on the more complicated code in cox_Rcallback.c in the 
survival package, for penalized Cox regression
https://svn.r-project.org/R-packages/trunk/survival/src/cox_Rcallback.c

 	-thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle
#
Your example is perfectly clear. I'll take your suggestion.
Thanks a lot for your time-
Andrew
On Tue, 2006-04-04 at 10:00 -0700, Thomas Lumley wrote: