[R] Properly initializing a plot
Roger Bivand
Roger.Bivand at nhh.no
Wed Sep 4 09:23:17 CEST 2002
On Wed, 4 Sep 2002, Martin Maechler wrote:
> >>>>> "Frank" == Frank E Harrell <fharrell at virginia.edu>
> >>>>> on Tue, 3 Sep 2002 12:30:01 -0400 writes:
>
> Frank> I have many functions for high-level plotting that
> Frank> early on in their code do something like
> Frank> strwidth('string', units='inches') before plotting.
> Frank> I do this before plot() to set the correct margins
> Frank> with par(mai=...), to leave room for wide text on the
> Frank> left or right margins. If the plotting device is not
> Frank> opened strwidth( ) causes an error that plot.new()
> Frank> needs to be called.
>
> yes.
>
> > x11()
> > strwidth("a")
> Error in strwidth("a") : plot.new has not been called yet
>
> As it says, it's plot.new(), *not* a (new) graphics window
> {and that should be opened automatically when needed by all R
> level plotting functions}.
>
>
> Frank> I can sense the need for
> Frank> plot.new() in the code using if(length(dev.list()).
>
> I don't think so. See the mini-example above
> Typically, I think you should consider using strwidth() and strheight()
> only *after* a first plot() call which sets up the coordinate
> system etc.
>
> Frank> If using postscript( ) as the device instead of the
> Frank> screen (X11()) I need to issue plot.new even though
> Frank> dev.list() is non-null. If I routinely call
> Frank> plot.new() I will get extra empty panels if the code
> Frank> in the calling environment included
> Frank> par(mfrow=c(#rows,#columns)).
>
> Frank> Does anyone know of almost foolproof code for
> Frank> initializing a new plot inside a high-level plotting
> Frank> function but not unnecessarily doing so?
>
> I'm pretty sure you want something like
>
> if(!dev.interactive())
> get(getOption("device"))()
>
> Note that help(device) has almost this as example :
>
> ## open the default screen device on this platform if no
> ## device is open
> if(dev.cur() == 1) get(getOption("device"))()
>
>
> But again, this does not quite answer your initial question
> about ``sensing when it's safe to use strwidth()'' !
>
Maybe:
> aa <- try(strwidth("a"))
Error in strwidth("a") : plot.new has not been called yet
> class(aa)
[1] "try-error"
or:
> options("show.error.messages"=FALSE)
> aa <- try(strwidth("a"))
> class(aa)
[1] "try-error"
Roger
--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Breiviksveien 40, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 93 93
e-mail: Roger.Bivand at nhh.no
and: Department of Geography and Regional Development, University of
Gdansk, al. Mar. J. Pilsudskiego 46, PL-81 378 Gdynia, Poland.
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help 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-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list