[R] Writing to a file with fixed precision

Duncan Murdoch murdoch at stats.uwo.ca
Fri May 19 03:34:58 CEST 2006


On 5/18/2006 8:20 PM, YIHSU CHEN wrote:
> Dear R users;
> 
> A follow-up question regarding writing to a file with fixed precision:
> 
> Assuming for each column of x, I would like to have a different format, then I modify the code as:
> 
> x.fmt <- apply(x, 1, function(x) sprintf("%.14f %.10f %2.5f", x))
> 
> where three different formats are %.14f %.10f %2.5f. 
> The error message I got is "Error in sprintf(fmt, ...) : too few arguments". 
> 
> If put %1$.14f %2$.10f %3$2.5f. instead, a different error message becomes:
> "Error in sprintf(fmt, ...) : reference to non-existent argument 2"
> 
> I do not exactly know what the problem is, or is there a more elegant way of completing this task.

The problem is that you are passing only one argument x to sprintf, so 
it doesn't like having 3 formats.  sprintf will apply the same format 3 
times to the 3 elements of x.

I'm not sure of a clean way to get what you want, but you could do it by 
splitting x into 3 parts to pass to sprintf and using do.call, e.g.

x.fmt <- apply(x, 1, function(x) do.call(sprintf, c("%.14f %.10f %2.5f", 
as.list(x))))

Duncan Murdoch

> 
>  Thank you
> 
> Yihsu Chen
> The Johns Hopkins University
> 
> 
> 
> 
> 
> 
> 
> On Mon, 10 Oct 2005, Marc Schwartz wrote:
> 
>> On Mon, 2005-10-10 at 19:50 -0400, Richard Hedger wrote:
>>> Hi,
>>> I'm trying to ouput to a filled with a fixed precision:
>>> eg. if I have data x=c(1.0,1.4,2.0), I want to be able to ouput the following to a file:
>>> 1.00000000000000
>>> 1.40000000000000
>>> 2.00000000000000
>>> I was wondering if there was a function to do this in R?
>>> Thanks,
>>> Richard
>> It is possible that someone has written such a function somewhere.
> 
> It's called format().
> 
> x <- c(1.0,1.4,2.0)
> write(format(x, nsmall=14))
> 
> does this.
> 
>> 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:
>>
>>> x
>> [,1] [,2] [,3] [,4]
>> [1,] 1 4 7 10
>> [2,] 2 5 8 11
>> [3,] 3 6 9 12
>>
>>> x.fmt <- apply(x, 1, function(x) sprintf("%.14f", x))
>>> x.fmt
>> [,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"
>>
>>> write.table(x.fmt, "data.txt", col.names = FALSE, row.names = FALSE,
>> 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. 
> Yihsu Chen
> The Johns Hopkins University
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html




More information about the R-help mailing list