Имена подстолбцов в сетке Extra

Я пытаюсь создать таблицу с помощью пакета gridExtra в R и хочу, чтобы имена вложенных столбцов были под общим именем столбца. Например, есть один большой столбец под названием «Урбана-Шампейн», который охватывает два меньших столбца с названиями «элемент» и «количество генов». Я искал везде на сайте поддержки gridExtra, но не могу найти способ создать общие имена столбцов, которые охватывают подстолбцы. Кто-нибудь знает, как?


person user2612392    schedule 23.07.2013    source источник
comment
Рискну предположить, что вы не сможете этого сделать без действительно серьезного взлома на уровне кода grid.   -  person joran    schedule 24.07.2013
comment
Я попытался переписать grid.table для проверки концепции на основе gtable, но так и не закончил. Предварительно он поддерживал многострочные заголовки, хотя мне так и не удалось найти для них хороший синтаксис.   -  person baptiste    schedule 24.07.2013
comment
Я бы попытался смоделировать это, расположив 2 таблицы, одну таблицу только с заголовком и другую таблицу с данными.   -  person agstudy    schedule 24.07.2013
comment
@agstudy проблема в деталях; grid.table регулирует ширину столбцов в соответствии с содержимым, поэтому довольно сложно выровнять что-либо извне с существующими столбцами. Есть только информация о размере стола, через grobWidth и grobHeight.   -  person baptiste    schedule 24.07.2013


Ответы (1)


Довольно легко получить базовую gtable и добавить в нее новый текст, но вам придется добавить все форматирование и стиль ячеек. Вот где я всегда сдаюсь — слишком много параметров и опций, о которых нужно позаботиться.

library(gtable)
gtable_add_grobs <- gtable_add_grob #misleading name

d <- head(iris, 3)

extended_matrix <- cbind(c("", rownames(d)), rbind(colnames(d), as.matrix(d))) 

all_grobs <- matrix(lapply(extended_matrix, textGrob), ncol=ncol(d) + 1)

row_heights <- function(m){
  do.call(unit.c, apply(m, 1, function(l)
    max(do.call(unit.c, lapply(l, grobHeight)))))
}

col_widths <- function(m){
  do.call(unit.c, apply(m, 2, function(l)
    max(do.call(unit.c, lapply(l, grobWidth)))))
}

g <- gtable_matrix("table", grobs=all_grobs,
                   widths=col_widths(all_grobs) + unit(4,"mm"), 
                   heights=row_heights(all_grobs) + unit(4,"mm"))

g <- gtable_add_rows(g, unit(1, "line"), 0)
g <- gtable_add_grobs(g, list(textGrob("Sepal's main title"), 
                              textGrob("Petal's main title"))
                     t=1,b=1,l=c(2, 4), r=c(3, 5))

grid.newpage()
grid.draw(g)

введите здесь описание изображения

person baptiste    schedule 24.07.2013
comment
gridExtra::tableGrob теперь основан на gtable, что упрощает такую ​​настройку. - person baptiste; 16.07.2015