2015-08-24 3 views
2

У меня есть некоторые относительно простой код для создания таблицы для печати в формате PDF:R tableGrob формат изменение строки

library(gridExtra) 
df <- head(iris) 
tableGrob(df, gp = gpar(fontsize = 8), rows = NULL) 

я хотел бы сделать в последней строке в том же формате, что и строки заголовка (полужирный , и более темный серый фон). Я понимаю, что я могу использовать gpar для управления форматом всей таблицы, но не уверен, как просто повлиять на последнюю строку.

Спасибо!

ответ

3

Одним из вариантов является создание новой таблицы, и слить два вместе,

g1 <- tableGrob(iris[1:4, 1:3], rows=NULL) 
g2 <- tableGrob(iris[1, 1:3], rows=NULL, # can't have empty content 
       cols=as.character(iris[4, 1:3])) # use 4th row as header 

grid.newpage() 
g <- rbind(g1[-nrow(g1), ], g2[1,]) 
grid.draw(g) 

enter image description here

+0

Мне нравится ваше второе решение. Однако, как мне преобразовать это в объект grob, например g1? –

+0

'rbind()' дает вам gtable – baptiste

+0

Это идеальное элегантное решение! Благодаря! Хорошо работает в RStudio. Однако, если у меня есть список таких grobs, g, по какой-то причине, этот формат, кажется, теряется при использовании grid.arrange. Например, 'myGrobs <- list (grob (g), grob (g))', то 'grid.arrange (grobs = myGrobs)', похоже, не сохраняет формат 'grid.draw (g)' в RStudio , Ошибок и предупреждений тоже нет. Это легко исправить? Возможно, это требует новой должности. –

1

Я просто вспомнил, что параметры форматирования получить повторно (но только с вменяемой логикой после версия> = 2.2.0), так что вы можете сделать,

library(gridExtra) 
library(grid) 
t1 <- ttheme_default(core=list(
     fg_params=list(fontface=c(rep("plain", 4), "bold.italic")), 
     bg_params = list(fill=c(rep(c("grey95", "grey90"), 
            length.out=4), "#6BAED6")) 
     )) 

grid.newpage() 
grid.table(iris[1:5, 1:3], theme=t1) 

enter image description here

4

Вы можете редактировать grobs, как это было предложено в the vignette

library(gridExtra) 
g <- tableGrob(iris[1:4, 1:3]) 

edit_cell <- function(table, row, col, name="core-fg", ...){ 
    l <- table$layout 
    ids <- which(l$t %in% row & l$l %in% col & l$name==name) 
    for (id in ids){ 
    newgrob <- editGrob(table$grobs[id][[1]], ...) 
    table$grobs[id][[1]] <- newgrob 
    } 
    table 
} 

g <- edit_cell(g, nrow(g), seq_len(ncol(g)), "core-fg", 
       gp=gpar(fontsize=15, fontface="bold")) 
g <- edit_cell(g, nrow(g), seq_len(ncol(g)), "core-bg", 
       gp=gpar(fill="darkolivegreen1", 
         col = "darkolivegreen4", lwd=5)) 

grid.newpage() 
grid.draw(g) 

enter image description here

Смежные вопросы