Re: [Rd] setting global options for a package

From: Duncan Murdoch <murdoch.duncan_at_gmail.com>
Date: Thu, 10 May 2012 14:10:47 -0400

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



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 10 May 2012 - 18:18:56 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 10 May 2012 - 18:21:17 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive