From tov@ece.cmu.edu  Thu Feb  1 01:13:12 2001
From: tov@ece.cmu.edu (tov@ece.cmu.edu)
Date: Thu, 1 Feb 2001 02:13:12 +0100 (MET)
Subject: [Rd] screen can't go back to log="y" plot (PR#831)
Message-ID: <200102010113.CAA25183@pubhealth.ku.dk>


Prof Brian D Ripley <ripley@stats.ox.ac.uk> writes:

> [I have abbreviated the subject as jitterbug has been having probems
> with long subjects.]
> 
> The issue here is that one cannot mix log/non-log axes in the calls to
> screen(), as the appropriate par() parameter is read-only, but the
> meaning of yaxp depends on it.  But beyond that you can't set
> x/yaxp for log axes.
> 
> You should be able to do this: you can in the S original.
> 
> A simpler version:
> 
> plot (1:2, 1:2, log="y", main="1")
> zz <- par("yaxp")
> zz
> [1]  1  2 -5
> par(yaxp=zz)
> Error in par(yaxp = zz) : invalid value specified for graphics parameter
> "yaxp".
> 
> So you can't reset the yaxp parameter to what it is reported as!
[snip]

The code in main/par.c ignores the value of xlog (or ylog) when
setting xaxp (or yaxp).  Right now you have in Specify (and Specify2):

... else if (streql(what, "xaxp")) {
	value = coerceVector(value, REALSXP);
	lengthCheck(what, value, 3);
	naRealCheck(REAL(value)[0], what);
	naRealCheck(REAL(value)[1], what);
        posIntCheck((int) (REAL(value)[2]), what);

Shouldn't that be something like:

... else if (streql(what, "xaxp")) {
	value = coerceVector(value, REALSXP);
	lengthCheck(what, value, 3);
	naRealCheck(REAL(value)[0], what);
	naRealCheck(REAL(value)[1], what);
        if (dd->gp.xlog)
            logAxpCheck((int) (REAL(value)[2]), what);
        else
            posIntCheck((int) (REAL(value)[2]), what);

Where logAxpCheck is suitably defined as:

static void logAxpCheck(int x, char *s)
{
    if (x == NA_INTEGER || x == 0 || x > 4)
	par_error(s);
}

since only values < 0 or the values 1, 2, 3 are allowed?


> Additional bug: the meaning of x/yaxp for log axes is not defined
> in help(par).

excerpt from help(par):

    xaxp: A vector of the form `c(x1, x2, n)' giving the coordinates
          of the extreme tick marks and the number of intervals
          between tick-marks.

Could you add:

          The value of n must be positive for linear scale axes.  For
          logarithmic scale axes n must be either negative (then there
          will be (1-n) ticks at a linear distance) or one of 1, 2, or
          3 where n then indicates the number of ticks per decade.

similar for yaxp?  What am I missing?
Regards,
  -tom

-- 
mailto:tov@ece.cmu.edu (Tom Vogels)   Tel: (412) 268-6638   FAX: -3204

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] screen can't go back to log="y" plot (PR#831)
tov@ece.cmu.edu