[R] persp(), scatterplot3d(), "..." argument

Paul Murrell p.murrell at auckland.ac.nz
Wed Oct 27 21:49:18 CEST 2004


Jari Oksanen wrote:
> On Wed, 2004-10-27 at 10:04, Uwe Ligges wrote:
>>Robin Hankin wrote:
>>>Hello list.
>>>I very often need 3d scatterplots, and use scatterplot3D quite a lot.
>>>I am trying to modify persp() to plot scatterplots, and make use of
>>>the theta and phi arguments that persp() offers.  I am having some
>>>difficulty passing the correct arguments to persp().
>>>Here is my function so far.  Much of it is copied from the persp() manpage.
>>>work as expected, but all extra arguments are passed to persp() _and_
>>>lines() and this gives warnings.
> ---cut---
>>>What is best practice to handle this sort of problem?  Should I ignore
>>>the warnings() that this approach gives?  I can suppress them with
>>>options(warn= -Inf), but is this a good idea?  I've read section 10.4
>>>of AITR.
>>Many of us have thought about this problem.
>>I'd suggest to introduce frequently used arguments to your meta-function 
>>(such as main, xlab, ylab, ...), but ignore warnings (note: warnings, 
>>not errors) if less frequently arguments are passed through "...".
>>Alternatively, you can exclude "..." from lines() or points() and 
>>specify a list of arguments to be passed to that call.
> This is a larger problem if 
> 1. one of the underlying functions does not have "..."
> 2. you want to relay arguments to two or more underlying functions, and
> 3. you don't want to list all possible arguments in your function
> definition, since it is long enough already.

4. you want to only relay arguments a, b, and c to one function and only 
c and d to another function.  For example, plot.default() only passes 
the col argument on to plot.xy() (not to axes or title).

5. arguments can have quite different meanings when passed to different 
functions.  e.g., col means fill colour when passed to rect(), but 
border colour when passed to box().

This all leads to argument lists like that for plot.default();  you make 
many par arguments formal arguments (with sensible defaults!) and 
explicitly control which functions they get relayed on to.

In your particular case, I think the best approach is to explicitly 
provide a bunch of arguments (with defaults) that might get passed to 
persp(), pass them to persp() and pass them plus everything else (...) 
to points().


p.s.  main, xlab, and ylab are not graphical parameters (as in par()) so 
I think they should definitely be formals of your points3d()

> The solution is still there, but it is (black) magic. For instance,
> 'arrows' does not have "...", so you must add them with this magical
> mystery string:
> formals(arrows) <- c(formals(arrows), alist(... = ))
> Yes, this is documented in R manuals -- I wouldn't know this otherwise.
> Still, it would be nicer if 'arrows' had "..."...
> cheers, jari oksanen

Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz

More information about the R-help mailing list