Re: [R] Format wanted...

2012-03-25 Thread Duncan Murdoch

On 12-03-24 10:47 PM, J Toll wrote:

On Sat, Mar 24, 2012 at 7:30 PM, Duncan Murdoch
murdoch.dun...@gmail.com  wrote:

Do we have a format that always includes a decimal point and a given number
of significant digits, but otherwise drops unnecessary characters?  For
example, if I wanted 5 digits, I'd want the following:

Round to 5 digits:
1.234567  -  1.2346

Drop unnecessary zeros:
1.23  -  1.23

Force inclusion of a decimal point:
1 -  1.



Duncan,

Maybe sprintf() will work for you.  As it's a wrapper for C sprintf,
it should have its functionality.


Maybe, but with which format string?

Duncan Murdoch

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Format wanted...

2012-03-25 Thread Marc Schwartz

On Mar 25, 2012, at 7:14 AM, Duncan Murdoch wrote:

 On 12-03-24 10:47 PM, J Toll wrote:
 On Sat, Mar 24, 2012 at 7:30 PM, Duncan Murdoch
 murdoch.dun...@gmail.com  wrote:
 Do we have a format that always includes a decimal point and a given number
 of significant digits, but otherwise drops unnecessary characters?  For
 example, if I wanted 5 digits, I'd want the following:
 
 Round to 5 digits:
 1.234567  -  1.2346
 
 Drop unnecessary zeros:
 1.23  -  1.23
 
 Force inclusion of a decimal point:
 1 -  1.
 
 
 Duncan,
 
 Maybe sprintf() will work for you.  As it's a wrapper for C sprintf,
 it should have its functionality.
 
 Maybe, but with which format string?
 
 Duncan Murdoch


I don't believe (though could be wrong), that you can do it all with one format 
string, but can do it conditionally based upon the input. According to the C 
printf documentation, the use of # forces a decimal point to be present, even 
if there are no trailing digits. Thus:

 sprintf(%#.f, 1)
[1] 1.

The other two values seem to be handled by signif() when applied to each value 
individually:

 signif(1.234567, 5)
[1] 1.2346

 signif(1.23, 5)
[1] 1.23

But, not when a vector:

 signif(c(1.234567, 1.23), 5)
[1] 1.2346 1.2300


So, wrapping that inside a function, using ifelse() to test for an integer 
value:

signif.d - function(x, digits)
{
  ifelse(x == round(x), 
 sprintf(%.#f, x), 
 signif(x, digits))
}


x - c(1.234567, 1.23, 1)

 signif.d(x, 5)
[1] 1.2346 1.23   1.  

 signif.d(x, 6)
[1] 1.23457 1.231. 

 signif.d(x, 7)
[1] 1.234567 1.23 1.  


Not extensively tested of course, but hopefully that might work for your needs 
Duncan.

Regards,

Marc Schwartz

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Format wanted...

2012-03-25 Thread Duncan Murdoch

On 12-03-25 10:45 AM, Marc Schwartz wrote:


On Mar 25, 2012, at 7:14 AM, Duncan Murdoch wrote:


On 12-03-24 10:47 PM, J Toll wrote:

On Sat, Mar 24, 2012 at 7:30 PM, Duncan Murdoch
murdoch.dun...@gmail.com   wrote:

Do we have a format that always includes a decimal point and a given number
of significant digits, but otherwise drops unnecessary characters?  For
example, if I wanted 5 digits, I'd want the following:

Round to 5 digits:
1.234567  -   1.2346

Drop unnecessary zeros:
1.23  -   1.23

Force inclusion of a decimal point:
1 -   1.



Duncan,

Maybe sprintf() will work for you.  As it's a wrapper for C sprintf,
it should have its functionality.


Maybe, but with which format string?

Duncan Murdoch



I don't believe (though could be wrong), that you can do it all with one format string, 
but can do it conditionally based upon the input. According to the C printf 
documentation, the use of # forces a decimal point to be present, even if 
there are no trailing digits. Thus:


sprintf(%#.f, 1)

[1] 1.

The other two values seem to be handled by signif() when applied to each value 
individually:


signif(1.234567, 5)

[1] 1.2346


signif(1.23, 5)

[1] 1.23

But, not when a vector:


signif(c(1.234567, 1.23), 5)

[1] 1.2346 1.2300


So, wrapping that inside a function, using ifelse() to test for an integer 
value:

signif.d- function(x, digits)
{
   ifelse(x == round(x),
  sprintf(%.#f, x),
  signif(x, digits))
}


x- c(1.234567, 1.23, 1)


signif.d(x, 5)

[1] 1.2346 1.23   1.


signif.d(x, 6)

[1] 1.23457 1.231.


signif.d(x, 7)

[1] 1.234567 1.23 1.


Not extensively tested of course, but hopefully that might work for your needs 
Duncan.


Thanks.  I had put together a different conditional (just do the 
conversion, then add a decimal point at the end if none is seen), but I 
was surprised that there was no standard format for this.


In case anyone is interested, I want to output code in a language (GLSL) 
that sees 1 and 1. as different types.  I want a floating point value, 
so I need the decimal point.


Duncan Murdoch

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Format wanted...

2012-03-25 Thread Hasan Diwan
Duncan,

On 25 March 2012 15:28, Duncan Murdoch murdoch.dun...@gmail.com wrote:
 In case anyone is interested, I want to output code in a language (GLSL)
 that sees 1 and 1. as different types.  I want a floating point value, so I
 need the decimal point.

GLSL, assuming it's the one that I'm looking at[1], supports implicit
conversion from integer to float by appending .0 to the end.

-- 
Sent from my mobile device
Envoyait de mon portable
1. http://www.opengl.org/wiki/GLSL_Types#Implicit_conversion

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


[R] Format wanted...

2012-03-24 Thread Duncan Murdoch
Do we have a format that always includes a decimal point and a given 
number of significant digits, but otherwise drops unnecessary 
characters?  For example, if I wanted 5 digits, I'd want the following:


Round to 5 digits:
1.234567  - 1.2346

Drop unnecessary zeros:
1.23  - 1.23

Force inclusion of a decimal point:
1 - 1.

Duncan Murdoch

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Format wanted...

2012-03-24 Thread J Toll
On Sat, Mar 24, 2012 at 7:30 PM, Duncan Murdoch
murdoch.dun...@gmail.com wrote:
 Do we have a format that always includes a decimal point and a given number
 of significant digits, but otherwise drops unnecessary characters?  For
 example, if I wanted 5 digits, I'd want the following:

 Round to 5 digits:
 1.234567  - 1.2346

 Drop unnecessary zeros:
 1.23      - 1.23

 Force inclusion of a decimal point:
 1         - 1.


Duncan,

Maybe sprintf() will work for you.  As it's a wrapper for C sprintf,
it should have its functionality.


James

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.