【車輪の再発明(※)をしているのですが、その形が気になります】
tableのグラフィカルな表示のために、すべての美的カスタマイズ (セルの背景の塗りつぶし、テキストの色、フォント サイズなど) に簡単にアクセスできるテーマを提案したいと思います。
リストは当然の選択です。ただし、複雑なのは、テーブルにも固有の構造があるという事実から生じます。列ヘッダー、行ヘッダー、およびコア エントリを含めることができます。これら 3 つのブロックのそれぞれには、固有の美的デフォルトと要件が必要ですが、継承元の共通の親があります。実際、すべてのフォントが黒であることを直接指定できるようにしたいと考えています。特に列ヘッダーを上書きしない限り、この色も継承されます。
考えられる構成の 1 つは、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()
これは (驚くほど!) うまく機能しますが、まだ 1 つの問題があります。子の既定の属性を 1 つだけ変更したい場合は、他のすべての既定値が失われます。たとえば、上記の場合、構築中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 の内部レンダリング システムと命名システムに密接にバインドされているため、他のグラフィック要素には使用できません。