From marc_schwartz at me.com  Mon Apr 16 21:09:14 2012
From: marc_schwartz at me.com (Marc Schwartz)
Date: Mon, 16 Apr 2012 14:09:14 -0500
Subject: [Rd] I wish xlim=c(0,
	NA) would work. How about I send you a patch?
In-Reply-To: <E66794E69CFDE04D9A70842786030B932960C1@PA-MBX04.na.tibco.com>
References: <CAErODj9RJ60Xdp=sLu=pGRiBOY_CSsxnjUmqObxhHYtEhHyLxA@mail.gmail.com>
	<4F8C6167.5030905@gmail.com>
	<E66794E69CFDE04D9A70842786030B932960C1@PA-MBX04.na.tibco.com>
Message-ID: <9A518888-0248-466A-B5D6-5AFADC97E1CF@me.com>

I would say that Bill's example of reversing the axis range, which I have used many times over the years, along with Duncan's list of potential consequences for a myriad of functions/packages, are arguments against this change. 

Classically, R's defaults are generally sensible and if one wants to alter them, it is not unreasonable to expect some understanding of what the arguments are doing. To know how to manipulate a plot's axis ranges is not overly complicated. Knowing that R, by default, will extend them by 4% is arguably a little more subtle, but reading the documentation (eg. ?par) will enlighten one to that point.

To simply use:

  xlim = c(0, max(x))

or

  xlim = c(0, max(x, na.rm = TRUE))

or 

  xlim = c(0, max(x[is.finite(x)]))

depending upon what values in x (or y) one might have to worry about, or the reverse for an unknown min and a fixed max, is a reasonable solution to the issue that Paul raises. It is a few more keystrokes than using NA and avoids the myriad known and potentially unanticipated side effects.

Regards,

Marc Schwartz

On Apr 16, 2012, at 1:26 PM, William Dunlap wrote:

> plot(1:10, xlim=c(10,1)) reverses the x axis.
> If we allow plot(1:10, xlim=c(5,NA)), which
> direction should it go?    Would this require new
> parameters, {x,y}{min,max} or new paremeters
> {x,y}{axisDirection}?
> 
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
> 
> 
>> -----Original Message-----
>> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at r-project.org] On Behalf
>> Of Duncan Murdoch
>> Sent: Monday, April 16, 2012 11:14 AM
>> To: Paul Johnson
>> Cc: R Devel List
>> Subject: Re: [Rd] I wish xlim=c(0, NA) would work. How about I send you a patch?
>> 
>> On 12-04-16 1:52 PM, Paul Johnson wrote:
>>> I'm looking for an R mentor.  I want to propose a change in management
>>> of plot options xlim and ylim.
>> 
>> Your suggestion sounds reasonable, but because plot limits are such a
>> commonly used parameter, it would have to be done quite carefully.  The
>> questions I'd ask before implementing it are:
>> 
>>  - Are there other locations besides plot.default where xlim and ylim
>> are specified?  I'd like to have them updated consistently.
>> 
>>  - Are there any conflicting uses of NA for a limit in published packages?
>> 
>>  - Which package authors would need to be told about this change, so
>> they could make a compatible change?
>> 
>>  - Where does it need to be documented?
>> 
>> Duncan Murdoch
>> 
>>> 
>>> Did you ever want to change one coordinate in xlim or ylim? It happens
>>> to me all the time.
>>> 
>>> x<- rnorm(100, m=5, s=1)
>>> y<- rnorm(100, m=6, s=1)
>>> plot(x,y)
>>> 
>>> ## Oh, I want the "y axis" to show above x=0.
>>> 
>>> plot(x,y, xlim=c(0, ))
>>> 
>>> ##Output: Error in c(0, ) : argument 2 is empty
>>> 
>>>  plot(x,y, xlim=c(0,NA ))
>>> ## Output: Error in plot.window(...) : need finite 'xlim' values
>>> 
>>> 
>>> I wish that plot would let me supply just the min (or max) and then
>>> calculate the other value where needed.
>>> It is a little bit tedious for the user to do that for herself.  The
>>> user must be knowledgeable enough to know where the maximum (MAX) is
>>> supposed to be, and then supply xlim=c(0, MAX). I can't see any reason
>>> for insisting users have that deeper understanding of how R calculates
>>> ranges for plots.
>>> 
>>> Suppose the user is allowed to supply NA to signal R should fill in the blanks.
>>> 
>>> plot(x,y, xlim=c(0, NA))
>>> 
>>> 
>>> In plot.default now, I find this code to manage xlim
>>> 
>>>    xlim<- if (is.null(xlim))
>>>         range(xy$x[is.finite(xy$x)])
>>> 
>>> And I would change it to be something like
>>>    ##get default range
>>>    nxlim<- range(xy$x[is.finite(xy$x)])
>>> 
>>>    ## if xlim is NULL, so same as current
>>>     xlim<- if (is.null(xlim)) nxlim
>>> ## Otherwise, replace NAs in xlim with values from nxlim
>>>     else xlim[ is.na(xlim) ]<- nxlim[ is.na(xlim) ]
>>> 
>>> 
>>> Who is the responsible party for plot.default.  How about it?
>>> 
>>> Think of how much happier users would be!
>>> 
>>> pj



[Rd] I wish xlim=c(0, NA) would work. How about I send you a patch?
Marc Schwartz