knitr + マークダウンでクールなLaTeXっぽい表

LaTeXは嫌いでもLaTeXで作られる表が好きな人は多いですよね。

HTMLの表はCSSでデコってもスベってる感が・・・、という人向けです。

とりあえずイリスアイリス生

シンプルでまあいいかも。

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

イリスアイリスのHTMLテーブル

monoフォント以外でもなんとかなります。

kable(head(iris))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa

イリスアイリスのDataTables

並べ替えとかできるので、これはこれでありかと思います。

library(rCharts)
tbl <- dTable(head(iris))
tbl$show("inline", chartId = "tbl01", include_assets = TRUE, cdn = TRUE)

イリスアイリスのLaTeXテーブル!!

(画像じゃないよ)

magic_table(head(iris))

\[ \begin{array}{rrrrrl} \hline & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species \\ \hline 1 & 5.10 & 3.50 & 1.40 & 0.20 & setosa \\ 2 & 4.90 & 3.00 & 1.40 & 0.20 & setosa \\ 3 & 4.70 & 3.20 & 1.30 & 0.20 & setosa \\ 4 & 4.60 & 3.10 & 1.50 & 0.20 & setosa \\ 5 & 5.00 & 3.60 & 1.40 & 0.20 & setosa \\ 6 & 5.40 & 3.90 & 1.70 & 0.40 & setosa \\ \hline \end{array} \]

ANOVA!!

magic_table(aov(yield ~ block + N*P*K, npk))

\[ \begin{array}{lrrrrr} \hline & Df & Sum Sq & Mean Sq & F value & Pr(>F) \\ \hline block & 5 & 343.29 & 68.66 & 4.45 & 0.0159 \\ N & 1 & 189.28 & 189.28 & 12.26 & 0.0044 \\ P & 1 & 8.40 & 8.40 & 0.54 & 0.4749 \\ K & 1 & 95.20 & 95.20 & 6.17 & 0.0288 \\ N:P & 1 & 21.28 & 21.28 & 1.38 & 0.2632 \\ N:K & 1 & 33.13 & 33.13 & 2.15 & 0.1686 \\ P:K & 1 & 0.48 & 0.48 & 0.03 & 0.8628 \\ Residuals & 12 & 185.29 & 15.44 & & \\ \hline \end{array} \]

行列!

mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE,
               dimnames = list(c("row1", "row2"),
                               c("C.1", "C.2", "C.3")))
magic_table(mdat)

\[ \begin{array}{rrrr} \hline & C.1 & C.2 & C.3 \\ \hline row1 & 1.00 & 2.00 & 3.00 \\ row2 & 11.00 & 12.00 & 13.00 \\ \hline \end{array} \]

GLM!!GLM!!

magic_table(glm(Postwt ~ Prewt + Treat + offset(Prewt),
                family = gaussian, data = MASS::anorexia))

\[ \begin{array}{rrrrr} \hline & Estimate & Std. Error & t value & Pr(>|t|) \\ \hline (Intercept) & 49.7711 & 13.3910 & 3.72 & 0.0004 \\ Prewt & -0.5655 & 0.1612 & -3.51 & 0.0008 \\ TreatCont & -4.0971 & 1.8935 & -2.16 & 0.0340 \\ TreatFT & 4.5631 & 2.1333 & 2.14 & 0.0360 \\ \hline \end{array} \]

最後に

magic_tableという関数、ワンライナーです。

library(xtable)
magic_table <- function(x) 
  cat(paste("\\[", print(xtable(x), floating=FALSE, tabular.environment="array", print.results=FALSE, comment=FALSE, sanitize.colnames.function=I), "\\]", sep="\n"))

「テーブルの出力なんとかならんの?生テーブル出されても困るんだけど?」 https://github.com/yihui/knitr/issues/484 というのが発展して、 MathJaxに渡しちゃえばいんじゃね?っていうところまで行った結果です。 http://rpubs.com/Thell/xtable Thanks @Thell!!

Enjoy LaTeX!!