Hi, I just tried a fourth variant, closer to what ggplot2 uses (I think): to each grob is assigned a viewport with row and column positions (in my example during their construction, with ggplot2 upon editing), and they're all plotted in a given grid.layout. The timing is poor compared to pushing and upping viewports (twice as long).
Why would that be? All the best, baptiste (the full, self-contained comparison file is attached, run as: R --vanilla -f comparison.r ) # below is version 4 only makeContentInVp <- function(d){ content <- as.character(unlist(c(d))) nc <- ncol(d) nr <- nrow(d) n2nm <- function(nr, nc){ expand.grid(seq(1, nr), seq(1, nc)) } vp.ind <- n2nm(nr, nc) textii <- function(d, gp=gpar(), name="content-label-"){ function(ii) textGrob(label=d[ii], gp=gp, name=paste(name, ii, sep=""), vp=viewport(layout.pos.row=vp.ind[ii, 1], layout.pos.col=vp.ind[ii, 2])) } makeOneLabel <- textii(d=content, gp=gpar(col="blue")) lg <- lapply(seq_along(content), makeOneLabel) list(lg=lg, nrow=nrow(d), ncol=ncol(d)) } ## table4 uses grobs that already have a viewport assigned table4 <- function(content){ padding <- unit(4, "mm") lg <- content$lg ## retrieve the widths and heights of all textGrobs wg <- lapply(lg, grobWidth) # list of grob widths hg <- lapply(lg, grobHeight) # list of grob heights ## concatenate this units widths.all <- do.call(unit.c, wg) # all grob widths heights.all <- do.call(unit.c, hg) #all grob heights ## matrix-like operations on units to define the table layout widths <- colMax.units(widths.all, content$ncol) # all column widths heights <- rowMax.units(heights.all, content$nrow) # all row heights vp <- viewport(layout=grid.layout(content$nrow,content$ncol, w=widths+padding, h=heights+padding)) grid.draw(gTree(children=do.call(gList, lg), vp=vp)) } # uncomment for timing d <- head(iris) #d <- iris content2 <- makeContentInVp(d) # grid.newpage() # system.time(table3(content)) ## user system elapsed ## 4.422 0.091 4.787 grid.newpage() system.time(table4(content2)) ## user system elapsed ## 8.810 0.184 9.555 2009/9/25 hadley wickham <h.wick...@gmail.com>: > > This matches my experience with ggplot2 - I have been gradually moving > away from frameGrob and packGrob because doing the placement myself is > much faster (and for most of the cases I'm interested in, the full > power of packGrob is not needed) > > Hadley > > -- > http://had.co.nz/ >
______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.