3

【車輪の再発明(※)をしているのですが、その形が気になります】

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 の内部レンダリング システムと命名システムに密接にバインドされているため、他のグラフィック要素には使用できません。

4

1 に答える 1

1

車輪を再発明するのではなく、ラティスパッケージのパラメーター設定ユーティリティ関数からインスピレーションを得たいと思います。ラティスのグラフィカル パラメータ ツリーの個々のリーフ( によって返されるtrellis.par.get())trellis.par.set()を変更するには、変更したい要素の値だけを含むリスト構造を渡すことができます。

それについて説明する代わりに、そのアイデアがあなたの問題にどのように適用されるかを示すだけです:

library(grid)
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"))){
        ll <- list(bg=bg, fg=fg,
                   font=font, separator=separator, box=box,
                   core=core, row_header=row_header, col_header=col_header)
        dots <- list(...)
        Reduce(modifyList, c(list(ll), dots))
    }
## Two ways to change both the size and face of the col_header font

## (1) Pass in both modifications in a single list 
theme1 = table_theme(list(col_header=list(font=list(size=10, face="italic"))))
## (2) Pass each modification in in a list of its own
theme2 = table_theme(list(col_header=list(font=list(face="italic"))),
                    list(col_header=list(font=list(size=10))))
## Check that they both have the same effect
identical(theme1, theme1)
# [1] TRUE

を渡すのlist(col_header=list(font=list(face="italic")))は を行うよりも少し冗長ですがcol_header$font$face <- "italic"、構造は完全に相同であるため、前者を理解するのは難しくありません。

于 2013-05-16T22:19:13.987 に答える