[Rd] segments(*, col = c(..,NA,..)) {was "color NA ..."}

Paul Murrell paul@stat.auckland.ac.nz
Wed, 11 Jul 2001 10:58:30 +1200


> Note however the following `misbehavior' (I think)  of segments() :
>  n <- 8
>  x <- 1:n
>  ep <- 0.2
>  cc <- c(1:4,NA,6:n)
>    plot(x, col= cc, type='h')
>  points(x, col= cc, cex=2)
>  segments(x+ep, x[1], x+ep, x[n], col = cc)# *does* draw at 5+ep ..
> ------
> i.e. segments does not follow the general idea of
>  ``not drawing when color is NA ''
> (note that there is no compatibility issue here, since S-plus
>  does not allow NA colors--and vectorized ones in most cases--anyway.)
> And this seems to be ``on purpose'' :
> in  src/main/plot.c  in do_segments(), around line 1560, we have
>     dd->gp.col = INTEGER(col)[i % ncol];
>     if (dd->gp.col == NA_INTEGER)
> dd->gp.col = dd->dp.col;
> which means in S language that col = NA will be translated to col =
> Any reason why this would be a good idea ?

>From my memory of these things, this is how col=NA used to be treated in all
sorts of graphics functions.   In other words, segments() behaves like this
only because it hasn't been converted yet to the "new" interpretation of
col=NA (i.e., don't draw anything).


p.s.  we run into a bit of trouble with this issue for rect() and polygon().
Both use col=NA to indicate that the rect/polygon should not be FILLED, but
will still draw a border.  And its not so easy to just change the meaning of
col=NA -- we need to find a new way of specifying "don't fill, but do draw
the border".  One option would be col=NULL (?)

p.p.s.  rect(border=NA) doesn't draw a border, but will still fill the

p.p.s. polygon(border=NA) DOES draw a border in border=par(fg) -- you have
to use polygon(border=0) NOT to draw a border.

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