[R] number of decimal
David Winsemius
dwinsemius at comcast.net
Thu Jan 28 18:25:29 CET 2010
On Jan 28, 2010, at 12:08 PM, Marc Schwartz wrote:
>
> On Jan 28, 2010, at 10:04 AM, David Winsemius wrote:
>
>>
>> On Jan 28, 2010, at 10:55 AM, Marc Schwartz wrote:
>>
>>> Ivan,
>>>
>>> The default behavior for print()ing objects to the console in an R
>>> session is via the use of the print.* methods. For real numerics,
>>> print.default() is used and the format is based upon the number of
>>> significant digits, not the number of decimal places. There is
>>> also an interaction with par("scipen"), which influences when
>>> scientific notation is used. See ?print.default for more
>>> information on defaults and behavior, taking note of the 'digits'
>>> argument, which is influenced by options("digits").
>>>
>>> Importantly, you need to differentiate between how R stores
>>> numeric real values and how it displays or prints them.
>>> Internally, R stores real numbers using a double precision data
>>> type by default.
>>>
>>> The internal storage is not truncated by default and is stored to
>>> full precision for doubles, within binary representation limits.
>>> You can of course modify the values using functions such as
>>> round() or truncate(), etc. See ?round for more information.
>>>
>>> For display, Peter has already pointed you to sprintf() and
>>> related functions, which allow you to format output for "pretty
>>> printing" to things like column aligned tables and such. Those do
>>> not however, affect the default output to the R console.
>>
>> If one alters print.default, one can get different behavior, for
>> instance:
>>
>> print.default <- function (x, digits = NULL, quote = TRUE, na.print
>> = NULL, print.gap = NULL,
>> right = FALSE, max = NULL, useSource = TRUE, ...)
>> {if (is.numeric(x)) {x <- as.numeric(sprintf("%7.3f", x))}
>> noOpt <- missing(digits) && missing(quote) && missing(na.print) &&
>> missing(print.gap) && missing(right) && missing(max) &&
>> missing(useSource) && length(list(...)) == 0L
>> .Internal(print.default(x, digits, quote, na.print, print.gap,
>> right, max, useSource, noOpt))
>> }
>>
>> This will have the requested effect for numeric vectors, but does
>> not seem to be altering the behavior of print.data.frame().
>>
>>> print(ac2)
>> score pt times trt
>> 1 28.825139 1 0 1
>> 2 97.458521 1 3 1
>> 3 26.217289 1 6 1
>> 4 80.636507 2 0 1
>> 5 99.729364 2 3 1
>> 6 85.812312 2 6 1
>> 7 2.515870 3 0 1
>> 8 3.893545 3 3 1
>> 9 55.666848 3 6 1
>> 10 21.966027 4 0 1
>>> print(ac2$score)
>> [1] 28.825 97.459 26.217 80.637 99.729 85.812 2.516 3.894 55.667
>> 21.966
>>
>
>
> David,
>
> The issue there is that when printing the vector, you are using
> print.default() directly, so you get the desired result with a
> numeric vector.
Thanks, Marc;
I do understand. I had been hoping that there might be a "final common
pathway" to use a biochemistry analogy, at least for numeric objects,
but it appears not.
--
David.
>
> When you print the data frame, internally print.data.frame() calls
> format.data.frame(), which then internally uses format() on a column-
> by-column basis and there is the rub. format() brings you back to
> using significant digits on numeric vectors and of course returns a
> character vector. By the time the output is actually print()ed to
> the console, the original data frame has been converted to a
> formatted character matrix and that is what gets printed.
>
>> str(format.data.frame(ac2))
> 'data.frame': 10 obs. of 4 variables:
> $ score:Class 'AsIs' chr [1:10] "28.825139" "97.458521" "26.217289"
> "80.636507" ...
> $ pt :Class 'AsIs' chr [1:10] "1" "1" "1" "2" ...
> $ times:Class 'AsIs' chr [1:10] "0" "3" "6" "0" ...
> $ trt :Class 'AsIs' chr [1:10] "1" "1" "1" "1" ...
>
>
>> str(format.data.frame(ac2, digits = 2))
> 'data.frame': 10 obs. of 4 variables:
> $ score:Class 'AsIs' chr [1:10] " 28.8" " 97.5" " 26.2" " 80.6" ...
> $ pt :Class 'AsIs' chr [1:10] "1" "1" "1" "2" ...
> $ times:Class 'AsIs' chr [1:10] "0" "3" "6" "0" ...
> $ trt :Class 'AsIs' chr [1:10] "1" "1" "1" "1" ...
>
>
> This is why changing print.default() by itself is not sufficient.
> Other object classes are formatted and printed in varying ways and
> print methods have been defined for them which may not use it
> directly.
>
> HTH,
>
> Marc Schwartz
>
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
More information about the R-help
mailing list