如何在无表头表格中划掉单元格?gridExtra示例适配疑问
一、无表头表格的单元格加交叉线方法
首先,要创建无表头的tableGrob,需要在生成时指定rows=NULL和cols=NULL,这样就不会包含默认的表头行和列。接下来,用gtable_add_grob把交叉线的grobTree添加到目标单元格即可,核心是要准确指定单元格的位置(行和列的索引)。
举个完整的示例:
library(gridExtra) library(gtable) library(grid) # 创建无表头的表格grob no_header_g <- tableGrob(iris[1:4, 1:3], rows = NULL, cols = NULL) # 给第2行第3列的单元格添加交叉线 no_header_g <- gtable_add_grob( no_header_g, grobs = grobTree( segmentsGrob( x0 = unit(0, "npc"), y0 = unit(1, "npc"), x1 = unit(1, "npc"), y1 = unit(0, "npc"), gp = gpar(lwd = 2, col = "red") ), segmentsGrob( x0 = unit(0, "npc"), y0 = unit(0, "npc"), x1 = unit(1, "npc"), y1 = unit(1, "npc"), gp = gpar(lwd = 2, col = "red") ) ), t = 2, b = 2, l = 3, r = 3 # t/b是行范围,l/r是列范围,这里锁定第2行第3列 ) grid.draw(no_header_g)
这里要注意:无表头的表格,行索引从1开始对应数据的第一行,列索引从1开始对应数据的第一列,不用偏移(如果有表头的话,数据行是从2开始的)。
二、适配自己数据集时的问题排查
你提到用vignette示例适配自己的数据时遇到问题,大概率是单元格位置指定错误或者表格结构和示例不同导致的,咱们可以按以下步骤排查:
确认表格的结构:先打印
g$layout查看你的表格grob的布局,里面会列出每个元素的行(t/b)和列(l/r)位置,比如:g <- tableGrob(your_data, rows = NULL, cols = NULL) print(g$layout)从输出里找到你要添加交叉线的单元格对应的t/b/l/r数值,不要凭感觉猜。
检查是否有无表头的差异:如果你的数据集生成的表格默认带表头,那数据行的索引是从2开始的(表头是行1),这时候指定t/b要加1;如果是无表头,行索引从1开始,直接用数据行号即可。
先测试最小示例:用自己数据的前几行前几列做一个小表格,先成功添加交叉线,再逐步扩展到完整数据集,这样更容易定位问题。
检查grob的样式设置:比如
lwd是否太细导致看不见,或者col和表格背景色冲突,你可以先把交叉线设成红色这种显眼的颜色,确认显示后再调整样式。
举个调整位置的例子:假设你的无表头表格有5行4列,要给第4行第2列加交叉线,那t=4, b=4, l=2, r=2就可以。
内容的提问来源于stack exchange,提问作者Karsten W.

