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