Re: [Rd] Re: [R] Problem going back to a viewport with gridBase

From: Paul Murrell <p.murrell_at_auckland.ac.nz>
Date: Mon 06 Jun 2005 - 22:47:34 GMT

Hi

Gabor Grothendieck wrote:
> On 6/2/05, Paul Murrell <p.murrell@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.

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@stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Tue Jun 07 08:51:01 2005

This archive was generated by hypermail 2.1.8 : Mon 20 Feb 2006 - 03:21:06 GMT