[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