From murdoch.duncan at gmail.com  Thu May 10 20:10:47 2012
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Thu, 10 May 2012 14:10:47 -0400
Subject: [Rd] setting global options for a package
In-Reply-To: <4FAC0095.10802@wald.ucdavis.edu>
References: <4FABC9AE.20103@yorku.ca>
	<A487C006-8AA8-4914-A304-61729300C906@r-project.org>
	<4FAC0095.10802@wald.ucdavis.edu>
Message-ID: <4FAC04A7.7020703@gmail.com>

On 10/05/2012 1:53 PM, Duncan Temple Lang wrote:
> Or slightly more conveniently, use the default value of getOption() to return the vector
> of color names if the option is not set, e.g.
>
>   foo<- function(x, heplot.colors = getOption("heplot.colors",
>                                                 c("red", "blue", "black", "darkgreen", "brown", "darkgray")), ...)  {

If each option is only used in a small number of places, that's the 
easiest solution.  If they are used more widely, you have the problem of 
keeping the defaults consistent.  Several packages do their own 
home-brewed solutions to this.  In rgl it's done by having a package 
global variable r3dDefaults.  If a user changes it, they get their own 
copy in the global environment.  This means functions within rgl
need to use

get("r3dDefaults", envir=.GlobalEnv)

to do the lookups in the right place.

The igraph package also handles defaults for graph colors; I haven't 
really looked into how they did it.

You can do it using lexical scoping:  something like

myOptions <- local({
    opt1 <- default1
    opt2 <- default2
    function(...) {
       # If ... has no names, it's asking for values; if it has names, 
then change
       # the parents.  Or just create two functions, one for setting, 
one for getting.
   }
)

Duncan Murdoch


>
>     D.
>
> On 5/10/12 10:09 AM, Simon Urbanek wrote:
> >
> >  On May 10, 2012, at 9:59 AM, Michael Friendly wrote:
> >
> >>  This may be elementary, but I can't find an answer: How can I set up global options for
> >>  some specific arguments to functions in a package which can be easily changed by the user?
> >>
> >>  This question relates to the selection of colors used in functions in several packages (heplots,
> >>  genridge), where I want to provide reasonable default values for plots, but allow users to
> >>  change those defaults globally for all plots produced with my functions.
> >>
> >>  One solution is to use palette() for the default, as in
> >>
> >>  foo<- function(x, col=palette(), ...)  {}
> >>  but the standard palette is not appropriate for my use, and I'd rather not hijack more typical uses
> >>
> >>  Another is to use an explicit list of colors for default, as in
> >>
> >>  bar<- function(x, col=c('red', 'blue', 'brown', 'darkgreen', ...), ...)  {}
> >>  but this must be overridden each time by someone to wants to change the defaults.
> >>
> >>  options() seems like the way to go, but I'm not sure how to implement this.  If I use
> >>  a .onLoad function to set some options, will these be created in the global environment?
> >>  If not, how to make them so?
> >>
> >>  .onLoad<- function() {
> >>   options(heplot.colors =
> >>   c("red", "blue", "black", "darkgreen", "darkcyan","magenta", "brown","darkgray"))
> >
> >  You certainly don't want to do that - it would override user's setting and thus defeat the whole purpose of options.
> >
> >
> >>  }
> >>
> >>  My function could then use
> >>
> >>  foo<- function(x, getOption("heplot.colors"), ...)  {}
> >>
> >
> >  You can always do that:
> >
> >  foo<- function(x, heplot.colors = getOption("heplot.colors"), ...)  {
> >    if (is.null(heplot.colors)) heplot.colors<- c("red", "blue", "black", "darkgreen", "darkcyan","magenta", "brown","darkgray")
> >
> >  Cheers,
> >  Simon
> >
> >
> >>
> >>  -- 
> >>  Michael Friendly     Email: friendly AT yorku DOT ca
> >>  Professor, Psychology Dept.
> >>  York University      Voice: 416 736-5115 x66249 Fax: 416 736-5814
> >>  4700 Keele Street    Web:   http://www.datavis.ca
> >>  Toronto, ONT  M3J 1P3 CANADA
> >>
> >>  ______________________________________________
> >>  R-devel at r-project.org mailing list
> >>  https://stat.ethz.ch/mailman/listinfo/r-devel
> >>
> >>
> >
> >  ______________________________________________
> >  R-devel at r-project.org mailing list
> >  https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] setting global options for a package
Duncan Murdoch