From jorismeys at gmail.com  Tue May 23 17:53:24 2017
From: jorismeys at gmail.com (Joris Meys)
Date: Tue, 23 May 2017 17:53:24 +0200
Subject: [Rd] Inconsistency in handling of numeric input with %d by
	sprintf
In-Reply-To: <CABKQe-bStQz+AOQ7SGMcdiNY9BNOuaz21j7b3Mtp6-tqtpdbPg@mail.gmail.com>
References: <CAPRVBcx3OjFK0G=hk1g8qChYiQ7cuZPpep-kju-_BD4MErhDuA@mail.gmail.com>
 <CABKQe-bStQz+AOQ7SGMcdiNY9BNOuaz21j7b3Mtp6-tqtpdbPg@mail.gmail.com>
Message-ID: <CAO1zAVZNDbwMuV1v=fK6DMQqYt4o_4d6Vrme1jM_+BLnkNzsGQ@mail.gmail.com>

I initially thought this is "documented behaviour". ?sprintf says:

Numeric variables with __exactly integer__ values will be coerced to
integer. (emphasis mine).

Turns out this only works when the first value is numeric and not NA, as
shown by the following example:

> sprintf("%d", as.numeric(c(NA,1)))
Error in sprintf("%d", as.numeric(c(NA, 1))) :
  invalid format '%d'; use format %f, %e, %g or %a for numeric objects
> sprintf("%d", as.numeric(c(1,NA)))
[1] "1"  "NA"

So the safest thing is indeed passing the right type, but the behaviour is
indeed confusing. I checked this on both Windows and Debian, and on both
systems I get the exact same response.

Cheers
Joris

On Tue, May 23, 2017 at 4:53 PM, Evan Cortens <ecortens at mtroyal.ca> wrote:

> Hi Michael,
>
> I posted something on this topic to R-devel several weeks ago, but never
> got a response. My ultimate conclusion is that sprintf() isn't super
> consistent in how it handles coercion: sometimes it'll coerce real to
> integer without complaint, other times it won't. (My particular email had
> to do with the vectors longer than 1 and their positioning vis-a-vis the
> format string.) The safest thing is just to pass the right type. In this
> case, sprintf('%d', as.integer(NA_real_)) works.
>
> Best,
>
> Evan
>
> On Fri, May 19, 2017 at 9:23 AM, Michael Chirico <
> michaelchirico4 at gmail.com>
> wrote:
>
> > Consider
> >
> > #as.numeric for emphasis
> > sprintf('%d', as.numeric(1))
> > # [1] "1"
> >
> > vs.
> >
> > sprintf('%d', NA_real_)
> >
> > >  Error in sprintf("%d", NA_real_) :
> >
> >    invalid format '%d'; use format %f, %e, %g or %a for numeric object
> > >
> >
> > I understand the error is correct, but if it works for other numeric
> input,
> > why doesn't R just coerce NA_real_ to NA_integer_?
> >
> > Michael Chirico
> >
> >         [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
>
>
> --
> Evan Cortens, PhD
> Institutional Analyst - Office of Institutional Analysis
> Mount Royal University
> 403-440-6529
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



-- 
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Mathematical Modelling, Statistics and Bio-Informatics

tel :  +32 (0)9 264 61 79
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

	[[alternative HTML version deleted]]



[Rd] Inconsistency in handling of numeric input with %d by sprintf
Joris Meys