[我正在重新发明轮子 (*),我想到了它的形状问题。]
对于表格的图形显示,我想提出一个主题,可以轻松访问所有美学定制(例如填充单元格的背景、文本的颜色、字体大小等)。
列表是显而易见的选择。但是,复杂性来自表也具有内在结构的事实。它可以有一个列标题、一个行标题以及核心条目。这三个块中的每一个都应该有自己特定的美学默认值和要求,但有一个共同的父级可以继承。确实,我希望能够直接指定所有字体都应该是黑色的,除非我专门覆盖列标题,否则它也会继承这种颜色。
一种可能的构造是 R 中现有的函数环境(闭包)框架:嵌套结构在评估参数时自动解析。这是我的例子:
# helping function
inplace <- function(l, ...) modifyList(l, list(...))
table_theme <- function(bg = c("grey95", "grey98"),
fg = c("black", "black"),
just=c("center","center"), hjust=0.5, vjust=0.5,
padding = unit(c(4,4),"mm"),
font = list(family = "sans", size = 12, face = "plain"),
separator = list(h=FALSE, v=TRUE), box = FALSE,
core = list(bg=bg, fg=fg, parse=TRUE,
separator=separator, box=box, padding=padding,
just=just, hjust=hjust, vjust=vjust, font=font),
col_header = inplace(core, parse=FALSE,
font=inplace(font, face="bold")),
row_header = inplace(col_header, just=c("right", "center"),
font = inplace(font, face="italic"),
hjust=1, padding=unit(c(4,4),"mm"))){
list(bg=bg, fg=fg,
font=font, separator=separator, box=box,
core=core, row_header=row_header, col_header=col_header)
}
theme = table_theme()
它工作得很好(令人惊讶!),但仍然存在一个问题:如果我只想更改孩子的一个默认属性,我会丢失所有其他默认值。例如,在上面theme
,在构造过程中修改theme$col_header$font
并非易事:我必须将完整调用重写为
table_theme(col_header = inplace(list(bg = c("grey95", "grey98"),
fg = c("black", "black"),
just=c("center","center"), hjust=0.5, vjust=0.5,
padding = unit(c(4,4),"mm"),
font = list(family = "sans", size = 12, face = "plain"),
separator = list(h=FALSE, v=TRUE), box = FALSE),
font=inplace(font, face="bold"))
但是在创建主题后相对容易修改,
theme$col_header$font$face <- "bold"
我是否错过了一种使用两全其美的聪明方法——使用闭包对嵌套结构进行自动自洽评估并轻松访问孩子的个人特征?
PS:(*):我知道 ggplot2 有一个新的主题系统,具有一些继承性;不幸的是,它与 ggplot2 的内部渲染系统和命名系统紧密绑定,因此无法用于其他图形元素。