[Rd] advice on arguments
Duncan Murdoch
murdoch at stats.uwo.ca
Fri Jun 30 12:40:36 CEST 2006
On 6/30/2006 2:30 AM, Eric Lecoutre wrote:
> Hi Ben,
>
> I have often asked myself such question and often
> come back to the following additional options:
>
> (4) Use '...' and ensure encapsulated functions/calls (foo2 and foo3) also
> have '...' within their arguments. There is no problem to call 3dspehre with
>
> a list of arguments that include both 'radius' and 'size' if (and only if)
> 3dsphere
> function argumnts are (radius=,...) so that size will just be ignored.
>
> foo1 <- function(...){
> foo2(...)
> foo3(...)
> }
There are some problems with this approach (as there are problems with
all the other approaches; whether these matter is a matter of judgment):
- It may require you to modify foo2 and foo3. In this particular
instance, foo2 and foo3 are in a package, not under Ben's direct control.
- It breaks R's ability to warn you about typos. For example,
foo1(sz = 3)
would not cause an unrecognized parameter error; both functions would
accept and ignore the bad parameter setting.
- It breaks the partial argument matching, e.g.
foo1(siz = 3)
would act just like the above, instead of like
foo1(size = 3)
Duncan Murdoch
>
> Document that all arguments foo2 can handle could be
> introduced within a cool to foo1, as well as those foo3 arguments.
> Only problem/point of detail is case where foo2 and foo3 do share
> arguments and you would like to distinguish.
>
> Then use (5)
> foo1 <- function(x,foo2Args=list(radius=2), foo3Args=list(size), ...){
> do.call("foo2",foo2Args)
> # or do.call("foo2",c(foo2Args,list(...)) depending on what you prefer
> }
>
> Eric
>
>
> 2006/6/29, Ben Bolker <bolker at zoo.ufl.edu>:
>>
>> I have a general style question about R coding.
>>
>> Suppose I'm writing a function (foo1) that calls other functions
>> (foo2, foo3, ...) which have complicated argument
>> lists (e.g. optim(), plot()), _and_
>> I may be calling several different functions in the body of
>> foo1. Since foo2 and foo3 have different sets of arguments, I
>> can't just use "..." ; I did write some code a while ago that
>> would look at formals() to dissect out arguments that should
>> be passed to the different functions, but it seemed overly
>> complex.
>>
>> The particular case I have now is a little simpler.
>>
>> foo2 (points3d) and foo3 (spheres3d)
>> are both functions from the rgl package
>> that pass arguments such as color, alpha, etc. along to
>> an rgl.material() command with lots of possible arguments.
>> (The function may also call segments3d or lines3d, but
>> these all have the same arguments as points3d.)
>> However, to change the size of points you use "size"; to
>> change the size of spheres you use "radius". Do I
>> (1) add "radius" to the argument list, cluttering up
>> the argument list for one particular special case?
>> (2) add "size" to the argument list, so that it doesn't
>> become part of "..." and I can say spheres3d(radius=size,...) ?
>> (3) do something like
>> dotlist = list(...)
>> if (type=="s" && !is.null(dotlist$size)) radius <- dotlist$size
>> and pull "size" out of ... myself (and make a note to that
>> effect in the documentation)?
>> (I guess another general solution to this is to ask for
>> lists of arguments, like MoreArgs in mapply(). Another
>> would be to go back and change spheres3d to make size
>> a synonym for radius ... )
>>
>> any thoughts?
>> Ben Bolker
>>
>>
>> --
>> 620B Bartram Hall bolker at zoo.ufl.edu
>> Zoology Department, University of Florida http://www.zoo.ufl.edu/bolker
>> Box 118525 (ph) 352-392-5697
>> Gainesville, FL 32611-8525 (fax) 352-392-3704
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
>
More information about the R-devel
mailing list