R - 使用xtable或kable创建的HTML表中的条件行突出显示

时间:2014-11-24 21:57:39

标签: r knitr r-markdown xtable

我几乎是以编程方式格式化R输出的初学者,但我对knitrxtable,Markdown和Pandoc将一种标记格式转换为另一种格式的能力有了基本的了解。我想要做的是将R数据帧df写入HTML表格,并将特定颜色应用于满足条件的每一行(例如df$outcome == 1)。但是,我不确定哪个包可以通过简单有效的方式完成此任务,但是通过浏览一些表格格式线程(xtable thread 1xtable thread 2kable documentation 1),我已经我认为kablextable可能会达到我想要的结果。

为了澄清,这是我可重复的示例(使用xtable,但我对使用kable或其他包的答案感兴趣):

set.seed(123)
df <- data.frame(id       = sample(1:100, 20, replace = TRUE),
                 inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
                 outcome  = sample(1:4, 20, replace = TRUE))

library(xtable)
dfxt <- xtable(df)

knit2html(input      = "~/rowcolor_ex.Rmd",
          output     = OUTPUTHERE
          stylesheet = "STYLESHEET.css")

knit2html引用名为“rowcolor_ex.Rmd”的文件,如下所示:

```{r,echo=FALSE,results='asis',warning=FALSE,message=FALSE}
print(dfxt, 
      type = "html",
      include.rownames = FALSE,)
```

我理解如果我要使用xtable,我会在print(dfxt,文档中的Rmd部分函数调用之后包含一个或多个参数,并{{1} 3}}显示了对add.to.row有意义的type = "latex"参数,但不清楚HTML输出的代码会如何变化。另外,我不确定引用knit2html中的CSS样式表是否会覆盖HTML表的格式。

4 个答案:

答案 0 :(得分:15)

以下是使用Gmisc::htmlTable

的解决方案
set.seed(123)
df <- data.frame(id       = sample(1:100, 20, replace = TRUE),
                 inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
                 outcome  = sample(1:4, 20, replace = TRUE))

cols <- with(df, ifelse(outcome == 1, 'magenta', 'white'))

library(Gmisc)
htmlTable(as.matrix(df), altcol = cols, 
          rgroup = '', n.rgroup = rep(1, length(cols)))

修改

由于htmlTable已移至包htmlTable,且不再位于Gmisc&gt; = 1.0,因此新的方法是

library('htmlTable')
htmlTable(as.matrix(df), col.rgroup = cols)

还给出了:

enter image description here

你的降价代码就是

```{r, results='asis'}
htmlTable(as.matrix(df), altcol = cols, 
          rgroup = '', n.rgroup = rep(1, length(cols)))
```

我的.Rmd看起来像:

---
output: 
  html_document:
    css: ~/knitr.css
---

```{r, results='asis', message=FALSE}
set.seed(123)
df <- data.frame(id       = sample(1:100, 20, replace = TRUE),
                 inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
                 outcome  = sample(1:4, 20, replace = TRUE))

cols <- with(df, ifelse(outcome == 1, 'magenta', 'white'))

library(Gmisc)
htmlTable(as.matrix(df), altcol = cols, 
          rgroup = '', n.rgroup = rep(1, length(cols)))
```

答案 1 :(得分:5)

好吧,不使用颜色(不支持降价),但您可以使用粗体pandoc.table和general pander method >或斜体字体:

> library(pander)
> emphasize.rows(which(df$outcome == 2))
> pander(df)

-------------------------
 id   inputval   outcome 
---- ---------- ---------
 29     0.89        1    

*79*   *0.69*      *2*   

*41*   *0.64*      *2*   

*89*    *1*        *2*   

 95     0.66        1    

 5      0.71        1    

 53     0.54        1    

*90*   *0.6*       *2*   

*56*   *0.29*      *2*   

 46     0.14        4    

 96     0.97        1    

*46*   *0.91*      *2*   

 68     0.69        4    

 58     0.8         1    

 11     0.02        3    

 90     0.48        1    

 25     0.76        1    

 5      0.21        4    

 33     0.32        4    

*96*   *0.23*      *2*   
-------------------------

答案 2 :(得分:2)

我使用格式化RMarkdown文档玩了很多。

由于RMarkdown在生成结束PDF之前转换为LaTeX,因此您可以将在LaTeX中工作的参数传递给RMarkdown。 所以,添加

header-includes:
  - \usepackage{xcolor}
在RMarkdown文档的标题中,然后添加类似

的内容
for(i in seq(1, nrow(yourDataframe), by = 2)){
  yourDataframe[i, ] <- paste0("\\color{purple}", yourDataframe[i, ])
  row.names(yourDataframe)[i] <- paste0("\\color{purple}", row.names(yourDataframe)[i])
}

会在表格的每一行中为您提供紫色(或xcolor LaTeX包中指定和允许的任何颜色)条目。只是另一种强调条目的方式,这些条目不是基本的粗体或斜体。

这不是行突出显示,但可以为您提供进一步的自定义选项。

*使用pander包进行测试。

**您需要将此方法的任何因子列转换为字符列。

Output

答案 3 :(得分:1)

以下是使用ReporteRs的解决方案:

set.seed(123)
df <- data.frame(id = sample(1:100, 20, replace = TRUE),
  inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
  outcome  = sample(1:4, 20, replace = TRUE))

library( ReporteRs )
library( magrittr )

# create and format table
myft = df %>% FlexTable() %>% 
  setRowsColors( df$outcome == 1, 'magenta') %>% 
  setFlexTableWidths( c( 1, 1, 1) )

# create an html doc and send myft into
doc = bsdoc() %>% addFlexTable( myft )

# write the html file in a new dir
writeDoc( doc, "example_out/df.html")