r - grid.layout doesn't like respect and compound units -
using unit.pmax default comparison of widths/heights in gtable proving harder i'd hoped; after several hours of head scratching i've narrowed down situation:
library(grid) w <- list(unit(1,"null"), unit(1,"null")) class(w) <- c("unit.list", "unit") h <- unit(1, "in") gl1 <- grid.layout(1, 2, widths = w, heights = h, respect = true) grid.newpage() grid.show.layout(gl1) # fine w2 <- w w2[[1]] <- unit.pmax(unit(1,"null"), unit(1,"null")) gl2 <- grid.layout(1, 2, widths = w2, heights = h, respect = false) grid.newpage() grid.show.layout(gl2)# fine gl3 <- grid.layout(1, 2, widths = w2, heights = h, respect = true) grid.newpage() grid.show.layout(gl3) ## error in grid.call.graphics(l_setviewport, vp, true) : ## non-finite location and/or size viewport so combination of unit.pmax(unit(1,"null"), unit(1,"null")) , respect = true makes grid complain. in case you're wondering, situation come in ggplot2 facet_grid , theme(aspect.ratio = ...).
i can vaguely picture unit.pmax() should simplify null units before attempting use respect parameter, don't know means. in practice though, prevents me improving gtable's cbind/rbind.
any workaround?
edit: i'm not sure how provide minimal example ggplot2, other installing my fork , running
ggplot(data.frame(x=1:8, y=1:8, f=gl(2,4)), aes(x, y)) + geom_point() + facet_grid(f~.) + theme(aspect.ratio=3) # error in grid.call.graphics(l_setviewport, vp, true) : # non-finite location and/or size viewport so unit.pmax() fails in case, while current comparison method compare.unit(,,pmax) fails in other situations, such as,
p1 = qplot(1, 1); p2 = qplot(1,1) cbind(ggplotgrob(p1), ggplotgrob(p2), size="max") # error in mmm < each : comparison of these types not implemented
it's not optimal, if else fails, rewrite unit.pmax make wish did.
the following function acts unit.pmax() except that, whenever it's asked find maximimum of 2 or more unit objects, in "null" units, returns value of "largest" one, rather expression of form max(x,y,...). (see second code block below example.)
unit.pmax2 <- function (...) { select.i <- function(unit, i) { unit[i, top = false] } x <- list(...) numargs <- length(x) if (numargs == 0l) stop("no arguments @ least 1 expected") maxlength <- 0l (i in seq_len(numargs)) if (length(x[[i]]) > maxlength) maxlength <- length(x[[i]]) ## result <- max(unit.list.from.list(lapply(x, select.i, 1l))) ul <- grid:::unit.list.from.list(lapply(x, select.i, 1l)) ## result <- if(all(sapply(ul, attr, "unit")=="null")) { ## ul[which.max(ul)]} else {max(ul)} ## if (maxlength > 1l) (i in 2l:maxlength) { ## result <- unit.c(result, max(unit.list.from.list(lapply(x, ## select.i, i)))) ul <- grid:::unit.list.from.list(lapply(x, select.i, i)) ## temp <- if(all(sapply(ul, attr, "unit")=="null")) { ## ul[which.max(ul)]} else {max(ul)} ## result <- unit.c(result, temp) ## } result } to see difference between unit.pmax() , unit.pmax2(), compare:
a <- list(unit(1,"null"), unit(1,"null"), unit(1,"null")) b <- list(unit(1,"null"), unit(4,"null"), unit(1,"null")) c <- list(unit(1,"null"), unit(2,"null"), unit(1,"inch")) class(a) <- class(b) <- class(c) <- c("unit.list", "unit") unit.pmax(a, b, c) # [1] max(1null, 1null, 1null) max(1null, 4null, 2null) max(1null, 1null, 1inch) unit.pmax2(a, b, c) # [1] 1null 4null max(1null, 1null, 1inch) testing out shows works. (note need replace w2[[1]] <- ... w2[1] <- ... avoid complaint when respect = true.)
library(grid) w2 <- list(unit(1,"null"), unit(1,"null")) class(w2) <- c("unit.list", "unit") h <- unit(1, "in") w2[1] <- unit.pmax2(unit(1,"null"), unit(1,"null")) ## w2[[1]] <- unit.pmax(unit(1,"null"), unit(1,"null")) ## comparison gl3 <- grid.layout(1, 2, widths = w2, heights = h, respect = true) grid.newpage() grid.show.layout(gl3) 
Comments
Post a Comment