2013-03-14 51 views
17

我有一个数据框,并且我想通过knitr和RMarkdown以HTML形式将其输出为带有条件格式的表格。示例:使用条件格式创建带有RMarkdown + knitr的表格

n <- data.frame(x = c(1,1,1,1,1), y = c(0,1,0,1,0)) 
> n 
    x y 
1 1 0 
2 1 1 
3 1 0 
4 1 1 
5 1 0 

我希望突出显示具有不同x和y值的行。因此,在这种情况下,这将是第1,3,5行。如果HTML文件中的输出是HTML表格,那么效果会很好,但如果图片失败,那么效果也不错。

+0

http://stackoverflow.com/questions/25315309/conditional-formatting-tables-in-rmarkdown-documents暗示ReportRs包,FlexTable – rescdsk 2015-04-21 17:03:39

回答

22

我一直想使用此功能在我的pander package中扩展pandoc.table,但没有得到时间。但这个问题真的很令人振奋,可能会在未来几天内做到这一点。在此之前,何谈:

  1. 加载包:

    library(pander) 
    
  2. 装入数据:

    n <- data.frame(x = c(1,1,1,1,1), y = c(0,1,0,1,0)) 
    
  3. 更新您的线被标记为Pandoc

    for (i in c(1, 3, 5)) 
        n[i, ] <- pandoc.strong.return(n[1, ]) 
    
  4. 显示你的表的降价版本:

    pandoc.table(n) 
    pander(n)  # S3 method 
    
  5. 隐性降价到例如与HTML语法brew

    Pandoc.brew(text = '<%=n%>', output = tempfile(), convert = 'html') 
    

更新:我已经更新pander采取一些新的论点很容易突显行/列/单元格。虽然我仍然在一些进一步的辅助功能的工作,使这个过程更容易,在这里不用一个快速演示,这样你可能会看到它如何能帮助您的工作流程:

> pandoc.table(n, emphasize.rows = c(1, 3, 5)) 

------- 
x y 
--- --- 
*1* *0* 

1 1 

*0* *1* 

1 1 

*1* *0* 
------- 

> pandoc.table(n, emphasize.strong.cells = which(n == 1, arr.ind = TRUE)) 

----------- 
    x  y 
----- ----- 
**1** 0 

**1** **1** 

**1** 0 

**1** **1** 

**1** 0 
----------- 

更新:pander积累了一些辅助功能,突出的表中的细胞更容易:

> t <- mtcars[1:3, 1:5] 
> emphasize.cols(1) 
> emphasize.rows(1) 
> pandoc.table(t) 

---------------------------------------------------- 
     &nbsp;   mpg cyl disp hp drat 
------------------- ------ ----- ------ ----- ------ 
    **Mazda RX4**  *21* *6* *160* *110* *3.9* 

**Mazda RX4 Wag** *21* 6 160 110 3.9 

    **Datsun 710** *22.8* 4 108 93 3.85 
---------------------------------------------------- 
pander方法

或者直接:

> emphasize.strong.cells(which(t > 20, arr.ind = TRUE)) 
> pander(t) 

--------------------------------------------------------- 
     &nbsp;   mpg  cyl disp  hp  drat 
------------------- -------- ----- ------- ------- ------ 
    **Mazda RX4**  **21** 6 **160** **110** 3.9 

**Mazda RX4 Wag** **21** 6 **160** **110** 3.9 

    **Datsun 710** **22.8** 4 **108** **93** 3.85 
--------------------------------------------------------- 

请注意,这些新功能尚未发布在CRAN上,但您可以在GitHub上托管最新版本。

17

这里是一个基于xtable的定制css的解决方案。我认为解决方案是灵活的,因为一旦你得到它的工作,你可以无限制地定制你的HTML表,如果你知道一些CSS技巧。

我们走吧。该解决方案包含3个文件:

  1. 一个css文件,其中我交替表行颜色。

    table { 
        max-width: 95%; 
        border: 1px solid #ccc; 
    } 
    
    th { 
        background-color: #000000; 
    color: #ffffff; 
    } 
    
    table tr:nth-child(odd) td{ 
        background-color: #FF0000; 
    } 
    table tr:nth-child(even) td{ 
        background-color: #00FFFF; 
    } 
    
  2. 的R脚本文件来设置RStudio降价,其内容如下:

    options(rstudio.markdownToHTML = 
         function(inputFile, outputFile) {  
         require(markdown) 
         markdownToHTML(inputFile, outputFile, stylesheet='customstyle.css') 
         } 
    ) 
    
  3. 创建具有以下新的降价:

    ```{r} 
    source('initmd.R') 
    ``` 
    
    
    ```{r,results='asis'} 
    library(xtable) 
    n <- data.frame(x = c(1,1,1,1,1), y = c(0,1,0,1,0)) 
    print(xtable(n),type='html') 
    ``` 
    

终于转换markdwon使用knit HTML按钮的HTML,你应该得到这样的东西:

enter image description here