Passing (Optional) Arguments
Jason Q. McClintic wrote:
Dear List:
In short, I am writing a number of functions as building blocks for
other functions and have some questions about scoping and passing arguments.
Suppose I have functions foo1, foo2, and foo3 such that:
foo1<-function(a=1,b=TRUE,c=FALSE){#do stuff};
foo2<-function(x=1,y=FALSE,z=c(1,2,3,4)){#do stuff};
foo3<-function(lambda,...){lambda*foo1()*foo2()};
I want to be able to pass a,b,c,x,y,z to the functions foo1 and foo2
though foo3 (whether I define default values or not). How do I do this?
I read a bit in the wiki about problems with partial argument matching
and argument matching (lesson: make argument names not match truncated
versions of other argument names in the "target" function).
That's tricky, because ... becomes one big list. You have a few choices: foo1 and foo2 can gain a ... arg, and ignore it. Then you pass ... to both of them. Problem: you can pass typos to them and won't get a complaint. foo3 can gain a,b,c,x,y,z args, and pass those along to foo1 and foo2. Problem: duplication, maintenance problems, etc. You can use list(...) in foo3, and manually split the args to those that belong in foo1 and those that belong in foo2, and then construct calls from them. (This allows you to recognize args that don't go to either place, and signal errors.) You can pass foo1Args and foo2Args as lists to foo3, and construct calls from those, e.g. foo3 <- function(lambda, foo1Args, foo2Args) lambda*do.call(foo1, foo1Args)*do.call(foo2,foo2Args) There are other options (e.g. using local versions of foo1 and foo2 within foo3) that are variations on the ones above. It's hard to give good advice on this, because whatever you do will be a tradeoff. You'll see variations on all of the above in the base packages. Duncan Murdoch
To get a better feel for things I've been playing with examples such as:
b<-c(0.25,0.25);
fun<-function(a=1,...){a*b};
fun() returns 0.25 0.25 as expected.
fun(a=2) returns 0.5 0.5 as expected.
However, fun(b=1) returns 0.25 0.25 when I want to overwrite b with the
value 1 and have it return 1.
Likewise with
fun<-function(a=1,...){a*return(b)};
any argument I supply for b seems to be ignored.
I understand as b is not defined within the function when I enter
fun()
lexical scoping means R looks for b up one level and, finding b, uses it.
Thanks for any/all help.
Sincerely,
Jason Q. McClintic
--
Jason Q McClintic
UST MB 1945
2115 Summit Avenue
St. Paul, MN 55105
jqmcclintic at stthomas.edu
mccl0219 at tc.umn.edu
"It is insufficient to protect ourselves with laws, we must protect
ourselves with mathematics."--Bruce Schneier
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.