Skip to content

Writing to a file with fixed precision

4 messages · Richard Hedger, Marc Schwartz, Brian Ripley

#
On Mon, 2005-10-10 at 19:50 -0400, Richard Hedger wrote:
It is possible that someone has written such a function somewhere.

However, this is relatively easy using write.table(). You just need to
pre-format the numeric values prior to writing to the file:

write.table(sprintf("%.14f", x), "data.txt", col.names = FALSE,
            row.names = FALSE, quote = FALSE)

Using sprintf(), we force the floats to have 14 decimal places.
sprintf() outputs character vectors, so we remove the quoting of the
resultant character vectors and don't write column/row names.

Note that if 'x' is a matrix, using sprintf() will return a vector. So
you might want to use the following instead to retain the dims:
[,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
[,1]                [,2]                [,3]               
[1,] "1.00000000000000"  "2.00000000000000"  "3.00000000000000" 
[2,] "4.00000000000000"  "5.00000000000000"  "6.00000000000000" 
[3,] "7.00000000000000"  "8.00000000000000"  "9.00000000000000" 
[4,] "10.00000000000000" "11.00000000000000" "12.00000000000000"
quote = FALSE)


If needed, you can of course change the default delimiter from a " " to
another character in write.table().

See ?write.table and ?sprintf.

HTH,

Marc Schwartz
#
On Mon, 10 Oct 2005, Marc Schwartz wrote:

            
It's called format().

x <- c(1.0,1.4,2.0)
write(format(x, nsmall=14))

does this.

  
    
#
On Tue, 2005-10-11 at 08:42 +0100, Prof Brian Ripley wrote:
Indeed. Sorry, I was not clear in my use of words. I was thinking along
the lines of a single function call such as:

  write.fmt(x, file = "data.txt", ndigits = 14)

It would of course be easy enough to create such a wrapper using
existing functions.

I was aware of format(), but for some reason had in the back of my mind
that the use of 'nsmall' was not consistent in the decimal place output
based upon prior experience.

The result of which led me to use the vectorized formatC() to control
such output. I then shifted to using sprintf(), when in 2.1.0, it was
vectorized.

Using format() also adds the benefit of having methods for matrices,
etc., as opposed to sprintf().

Thanks,

Marc