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@r-project.org mailing list
>>  https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>
>  ______________________________________________
>  R-devel@r-project.org mailing list
>  https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to