在knitr / Sweave rapports中着色/突出显示R ftable()输出的值

时间:2012-02-16 12:05:31

标签: r colors latex knitr

我为描述性报告生成了大量ftable()交叉制表。例如:

              AUS  BEL  BUL  EST  FRA  GEO  GER  HUN  ITA  NET  NOR  ROM  RUS

30- primary    0.06 0.03 0.07 0.03 0.02 0.03 0.03 0.02 0.05 0.03 0.05 0.04 0.02
    secondary  0.30 0.09 0.16 0.10 0.10 0.14 0.10 0.16 0.11 0.08 0.08 0.09 0.11 
    tertiary   0.05 0.07 0.04 0.05 0.07 0.06 0.02 0.04 0.02 0.05 0.06 0.02 0.09
30+ primary    0.07 0.16 0.12 0.07 0.16 0.03 0.05 0.11 0.35 0.21 0.09 0.17 0.03
    secondary  0.40 0.20 0.30 0.29 0.25 0.35 0.35 0.34 0.27 0.20 0.27 0.34 0.26
    tertiary   0.13 0.23 0.13 0.18 0.17 0.17 0.18 0.09 0.09 0.23 0.23 0.06 0.24
60+ primary    0.00 0.12 0.10 0.13 0.14 0.07 0.05 0.12 0.09 0.11 0.06 0.19 0.12
    secondary  0.00 0.05 0.05 0.08 0.06 0.10 0.14 0.09 0.02 0.04 0.11 0.07 0.06
    tertiary   0.00 0.05 0.03 0.06 0.03 0.04 0.07 0.03 0.01 0.05 0.06 0.02 0.07

我正在寻找可以采用ftable()table()输出的函数,以及偏离行均值的高亮值,或者为值的文本指定整体渐变,例如:从0到100%,值从红色变为绿色。

现在通过knitr处理输出,但我不确定工具链中的哪个位置可以进行干预,并根据值的相对大小添加颜色。

2 个答案:

答案 0 :(得分:5)

您可以使用latex包中的Hmisc功能。

# Example shamelessly copied from http://www.karlin.mff.cuni.cz/~kulich/vyuka/Rdoc/harrell-R-latex.pdf
cat('
  \\documentclass{article}
  \\usepackage[table]{xcolor}
  \\begin{document}
  <<results=tex>>=
  library(Hmisc)
  d <- head(iris)
  cellTex <- matrix(rep("", nrow(d) * ncol(d)), nrow=nrow(d))
  cellTex[2,2] <- "cellcolor{red}"
  cellTex[2,3] <- "color{red}"
  cellTex[5,1] <- "rowcolor{yellow}"
  latex(d, file = "", cellTexCmds = cellTex, rowname=NULL)
  @
  \\end{document}',
  file="tmp.Rnw" )
Sweave("tmp.Rnw")
library(utils)
texi2pdf("tmp.tex")

答案 1 :(得分:2)

要从R对象生成乳胶表,您可以使用xtable包。它是available on CRAN,请查看文档。要获得表格中的颜色,请使用color乳胶包。一些示例代码:

library(xtable)
n = 100
cat_country = c("NL","BE","HU")
cat_prim = c("primary","secondary","tertiary")
dat = data.frame(country = sample(cat_country, n, replace = TRUE), 
                 prim = sample(cat_prim, n, replace = TRUE))
ftable_dat = ftable(dat)

## Make latex table:
latex_table = xtable(as.table(ftable_dat))

为了得到你想要的东西我做了下面的黑客(丑陋的)。诀窍是打印xtable对象,然后编辑:

latex_table = within(latex_table, {
#   browser()
  primary = ifelse(primary > 12, sprintf("\\textbf{%s}", primary), primary)
  #primary = sub("\\{", "{", primary)
})
printed_table = print(latex_table)
printed_table = sub("backslash", "\\", printed_table)
printed_table = sub("\\\\}", "}", printed_table)
printed_table = sub("\\\\\\{", "{", printed_table)
printed_table = sub("\\$", "\\", printed_table)
printed_table = sub("\\$", "\\", printed_table)
cat(printed_table)

导致:

% latex table generated in R 2.14.1 by xtable 1.6-0 package
% Thu Feb 16 13:10:55 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrr}
  \hline
 & primary & secondary & tertiary \\ 
  \hline
BE & 10 &   5 &  11 \\ 
  HU & \textbf{13} &  13 &   8 \\ 
  NL & 11 &  17 &  12 \\ 
   \hline

\ {端片状} \ {端中心} \ {端表}

此示例使主要类别中的数字变为粗体,但它可以轻松地用于着色。也许别人有一个更优雅的解决方案?