[Rd] Re: [R] Problem going back to a viewport with gridBase
Gabor Grothendieck
ggrothendieck at gmail.com
Tue Jun 7 04:24:26 CEST 2005
On 6/6/05, Paul Murrell <p.murrell at auckland.ac.nz> wrote:
> Hi
>
>
> Gabor Grothendieck wrote:
> > On 6/2/05, Paul Murrell <p.murrell at auckland.ac.nz> wrote:
> >
> >>Hi
> >
> >
> > Thanks. I have mucked around in vpTree structures and discovered its
> > actually quite easy to specify children so I have changed my example
> > so that instead of naming the children of 'layout' and then remembering
> > coordinates linked to the names of the children of 'layout' in
> > the 'coords' structure (which really just duplicates state information
> > already available in grid) it simply follows the order
> > of the children of 'layout' directly. This permits elimination of 'coords'
> > and the two naming functions. Using the depth approach you advocate,
> > 'with' also becomes shorter and I think I have it to the point where it works
> > with both vpPath and viewport classes. Once Deepayan implements
> > the use.viewport= argument to print, 'with' can be eliminated too. No
> > questions this time but I thought I would post the latest version for
> > completeness. Regards.
>
>
> Ok. I can see this working ... for now. The disadvantage with this
> approach is that it makes use of the undocumented, internal structure of
> a viewport tree to grab a list of child viewports. A worse example of
> the same thing is that the with() methods make use of a happy
> coincidence that both viewport objects and viewport path objects share a
> component called "name" (and an even happier coincidence that they
> contain the same information). I think it would be cleaner and better
> practice, despite requiring longer code, to make use of the documented
> interface which requires specifying viewport names and viewport paths.
> The internal structure of objects is not guaranteed to be stable.
Perhaps accessor functions could be provided that allow one to
retrieve the name of a viewport and the name of a vpPath in
a safe way. These could be as simple as:
names.viewport <- names.vpPath <- function(x) x$name
Similarly an accessor function to safely retrieve the children would
be nice. Again, it should ideally be possible to
have a generic with methods for various grid classes.
Then the relevant line in the code concerning name
could be written in a safe way like this:
depth <- if (data$name == "ROOT") 0 else downViewport(names(data))
and similarly for the children.
>
> Paul
>
>
> > [pushLayout is same as before except there are no names on the
> > children of 'layout' and the rest is new]
> >
> > library(grid)
> > library(lattice)
> >
> > pushLayout <- function(nr, nc, name="layout") {
> > pushViewport(viewport(layout=grid.layout(nr, nc), name=name))
> > for (i in 1:nr) {
> > for (j in 1:nc) {
> > pushViewport(viewport(layout.pos.row=i, layout.pos.col=j))
> > upViewport()
> > }
> > }
> > upViewport()
> > }
> >
> > with.vpPath <- with.viewport <- function(data, expr, ...) {
> > # if data is a vpPath it cannot be ROOT since NULL will never
> > dispatch here
> > depth <- if (data$name == "ROOT") 0 else downViewport(data$name)
> > result <- eval.parent(substitute(expr))
> > upViewport(depth)
> > invisible(result)
> > }
> >
> > grid.newpage()
> >
> > # specify number of cells to fill and number of rows
> > n <- 5; nr <- 3
> >
> > nc <- ceiling(n/nr)
> > downViewport(pushLayout(nr, nc))
> >
> > vpt <- current.vpTree(all = FALSE)
> > for(k in 1:n) with(vpt$children[[k]],
> > print( xyplot(v ~ v, list(v = 1:k)), newpage = FALSE )
> > )
>
>
> --
> Dr Paul Murrell
> Department of Statistics
> The University of Auckland
> Private Bag 92019
> Auckland
> New Zealand
> 64 9 3737599 x85392
> paul at stat.auckland.ac.nz
> http://www.stat.auckland.ac.nz/~paul/
>
>
More information about the R-devel
mailing list