R-alpha: .Options$digits do not (always) work.

Bill Venables wvenable@attunga.stats.adelaide.edu.au
Thu, 14 Aug 1997 14:43:11 +0930


Martin Maechler writes:
 > >>>>> "Robert" == Robert Gentleman <rgentlem@stat.auckland.ac.nz> writes:
 > 
 >     Robert> Martin wrote:
 >     >> I am sorry that this IS an old topic.  Yet another task I think the
 >     >> bug is somewhere in hidden in src/main/options.c ..
 >     >> 
 >     >> ##-- The following does not work as it should in R (0.50-a1, but I
 >     >> think also earlier)
 >     >> 
 >     >> tst <- function(x=pi, dig =3) {.Options$digits <- as.integer(dig);
 >     >> print(x);x} tst() tst(dig = 12)
 >     >> 
 >     >> 
 >     >> ##-- This should do the same; it works as expected in R & S :
 >     >> 
 >     >> tst2 <- function(x=pi, dig =3) { oo <- options(digits=dig);
 >     >> on.exit(oo); print(x);x} tst2() tst2(dig = 12)

I think not.  Here is what you probably meant to use

tst2 <- function(x = pi, dig = 3) {
  oo <- options(digits = dig)
  on.exit(options(oo))
  print(x)
  x
}

> tst2()
[1] 3.14
[1] 3.14159

Notice that the on.exit() happens after the function is complete
but before auto-printing.

 >     Robert> Well it isn't really clear what Splus does to get
 >     Robert> tst to work. It appears that they use some form of
 >     Robert> dynamic scope for Options.  Clearly, the
 >     Robert> assignment, .Options$digits <- xxxx creates a local
 >     Robert> copy of .Options and changes the value of
 >     Robert> that.  The only way that print can find this local
 >     Robert> copy is if it looks up the stack of calling
 >     Robert> functions to find it (or perhaps Splus squirrels
 >     Robert> it away somewhere that print looks but then <-
 >     Robert> starts to behave in a very peculiar manner).  This
 >     Robert> sort of behaviour is bad for two reasons 1) We
 >     Robert> really want people to use lexical scope and any
 >     Robert> examples where you have dynamic scope simply
 >     Robert> confuse things 2) It is quite inefficient for
 >     Robert> print (and anything else that uses Options) to
 >     Robert> have to look up the stack of calling functions.
 > 
 > ok;
 > yes, I wonder too, how S-plus does it. (Bill V. ?)

(? Y me?) Sorry, but I don't have any inside knowledge.  A little
experimentation shows that

> options(digits = 10)

operates like an assignment sequence of the form

> .Options$digits <- 10
> assign(".Options", .Options, where = 6)  # or wherever...
> remove(".Options")

Which you normally cannot do directly, of course, (and clearly
the effect is not permanent).

Bill.

-- 
Bill Venables, Head, Dept of Statistics,    Tel.: +61 8 8303 5418
University of Adelaide,                     Fax.: +61 8 8303 3696
South AUSTRALIA.     5005.   Email: Bill.Venables@adelaide.edu.au
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-