[Rd] dput()

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Tue Mar 3 12:15:07 CET 2020


>>>>> Martin Maechler 
>>>>>     on Mon, 2 Mar 2020 15:36:51 +0100 writes:

>>>>> Duncan Murdoch 
>>>>>     on Mon, 2 Mar 2020 04:43:53 -0500 writes:

    >> On 02/03/2020 3:24 a.m., Martin Maechler wrote:
    >>>>>>>> robin hankin
    >>>>>>>> on Sun, 1 Mar 2020 09:26:24 +1300 writes:
    >>> 
    >>> >  Thanks guys, I guess I should have referred to FAQ 7.31
    >>> > (which I am indeed very familiar with) to avoid
    >>> > misunderstanding.  I have always used dput() to clarify
    >>> > 7.31-type issues.
    >>> 
    >>> > The description in ?dput implies [to me at any rate] that
    >>> > there will be no floating-point roundoff in its output.  I
    >>> > hadn't realised that 'deparsing' as discussed in dput.Rd
    >>> > includes precision roundoff issues.
    >>> 
    >>> > I guess the question I should have asked is close to
    >>> > Ben's: "How to force dput() to return an exact
    >>> > representation of a floating point number?".  Duncan's
    >>> > reply is the insight I was missing: exact decimal
    >>> > representation of a double might not be possible (this had
    >>> > not occurred to me).  Also, Duncan's suggestion of control
    >>> > = c("all", "hexNumeric") looks good and I will experiment
    >>> > with this.
    >>> 
    >>> This was not Duncan's suggestion but rather  Duncan's *citation* :
    >>> Note that he used  " .... " !
    >>> 
    >>> The citation is from  ?deparseOpts  (to which one is pointed when reading ?dput),
    >>> <rant>
    >>> but unfortunately many people nowadays have stopped reading texts
    >>> that are longer than a tweet... ;-)
    >>> <rant/>
    >>> ... and indeed,  ?dput  and  ?deparse  use    'control = "all"'
    >>> instead of   c("all", "hexNumeric")  when talking about getting
    >>> close to an inverse of parse()
    >>> 
    >>> As a matter of fact,  within R Core we had discussed this, many
    >>> moons ago and actually had more or less decided to make "all"
    >>> to *include* "digits17".
    >>> 
    >>> "digits17" is  "almost always" (I'm sorry I cannot quantify the
    >>> 'almost' here) sufficient ... and is obviously conflicting with
    >>> using hexadecimals instead of digits.
    >>> 
    >>> For R 4.0.0, I think we should finally consider doing something
    >>> here :
    >>> 
    >>> 1) define "all" to include "digits17"
    >>> so new "all" is current  c("all", "digits17")
    >>> {in a way such that c("all", "hexNumeric") implicitly removes
    >>> "digits17" (as it's in contradiction with "hexNumeric").
    >>> 
    >>> 2) add a new option  "AllHex" := c("all", "hexNumeric"),
    >>> (Note the capital "A":  such that  match.arg()-like abbreviation
    >>> of .deparseOpts() arguments remain possible and notably "all"
    >>> does not suddenly become ambiguous)
    >>> 
    >>> Of course, '1)' is well possible without '2)',
    >>> but '2)'  would allow to use  dput(*, control = "All")
    >>> which is somewhat easier to readers & writers.

    >> I think 1) is a good idea, and adding something with the meaning of 
    >> AllHex seems useful:  but that's not a name I'd choose, since it's not 
    >> consistent with the other names (which are almost all camelCase).  I'd 
    >> choose something like "exact" (even though it isn't :-).

    > Thank you -- you are right;
    > all "AllHex" is too non-orthodox and hence a pain for people to
    > get right, remember, etc.

    > In light of  Steven Dirkse's reply (and other much older e-mails
    > by others I remember only vaguely), it seems we still need to
    > find an example (with numbers) where it is not exact  ...
    > which makes  "exact" even more appropriate.

    > Martin

I've now committed these two proposals, using "exact" -- to
R-devel (i.e., for R 4.0.0).

(wanted in one svn commit, but accidentally needed 2: svn r77891 + ...2).

Martin


    >>> > On Sun, Mar 1, 2020 at 6:22 AM Duncan Murdoch
    >>> > <murdoch.duncan using gmail.com> wrote:
    >>> >>
    >>> >> On 29/02/2020 4:19 a.m., Ben Bolker wrote:
    >>> >> >
    >>> >> > I think Robin knows about FAQ 7.31/floating point
    >>> >> (author of > 'Brobdingnag', among other numerical
    >>> >> packages).  I agree that this is > surprising (to me).
    >>> >> >
    >>> >> > To reframe this question: is there way to get an
    >>> >> *exact* ASCII > representation of a numeric value (i.e.,
    >>> >> guaranteeing the restored value > is identical() to the
    >>> >> original) ?
    >>> >> >
    >>> >> > .deparseOpts has
    >>> >> >
    >>> >> > ‘"digits17"’: Real and finite complex numbers are
    >>> >> output using > format ‘"%.17g"’ which may give more
    >>> >> precision than the > default (but the output will depend
    >>> >> on the platform and there > may be loss of precision when
    >>> >> read back).
    >>> >> >
    >>> >> > ... but this still doesn't guarantee that all precision
    >>> >> is kept.
    >>> >>
    >>> >> "Using control = c("all", "hexNumeric") comes closest to
    >>> >> making deparse() an inverse of parse(), as representing
    >>> >> double and complex numbers as decimals may well not be
    >>> >> exact. However, not all objects are deparse-able even
    >>> >> with this option. A warning will be issued if the
    >>> >> function recognizes that it is being asked to do the
    >>> >> impossible."
    >>> >>
    >>> >> >
    >>> >> > Maybe
    >>> >> >
    >>> >> > saveRDS(x,textConnection("out","w"),ascii=TRUE) >
    >>> >> identical(x,as.numeric(out[length(out)])) ## TRUE
    >>> >> >
    >>> >> > ?
    >>> >> >
    >>> >> >
    >>> >> >
    >>> >> >
    >>> >> > On 2020-02-29 2:42 a.m., Rui Barradas wrote: >> Hello,
    >>> >> >>
    >>> >> >> FAQ 7.31
    >>> >> >>
    >>> >> >> See also this StackOverflow post:
    >>> >> >>
    >>> >> >>
    >>> >> https://stackoverflow.com/questions/9508518/why-are-these-numbers-not-equal
    >>> >> >>
    >>> >> >> Hope this helps,
    >>> >> >>
    >>> >> >> Rui Barradas
    >>> >> >>
    >>> >> >> Às 00:08 de 29/02/20, robin hankin escreveu: >>> My
    >>> >> interpretation of dput.Rd is that dput() gives an exact
    >>> >> ASCII form >>> of the internal representation of an R
    >>> >> object.  But:
    >>> >> >>>
    >>> >> >>> rhankin using cuttlefish:~ $ R --version >>> R version
    >>> >> 3.6.2 (2019-12-12) -- "Dark and Stormy Night" >>>
    >>> >> Copyright (C) 2019 The R Foundation for Statistical
    >>> >> Computing >>> Platform: x86_64-pc-linux-gnu (64-bit)
    >>> >> >>>
    >>> >> >>> [snip]
    >>> >> >>>
    >>> >> >>> rhankin using cuttlefish:~ $ R --vanilla --quiet >>>> x <-
    >>> >> sum(dbinom(0:20,20,0.35)) >>>> dput(x) >>> 1 >>>> x-1 >>>
    >>> >> [1] -4.440892e-16
    >>> >> >>>>
    >>> >> >>>> x==1 >>> [1] FALSE
    >>> >> >>>>
    >>> >> >>>
    >>> >> >>> So, dput(x) gives 1, but x is not equal to 1.  Can
    >>> >> anyone advise?



More information about the R-devel mailing list