使用RMarkdown + knitr创建带条件格式的表

时间:2013-03-14 07:57:14

标签: r knitr

我有一个数据框,我想通过knitr和RMarkdown将它作为带有条件格式的表格输出到HTML文件中。例如:

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表格,那么会很好。但是如果图像也没那么好。

2 个答案:

答案 0 :(得分:24)

我一直希望使用此功能在我的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中更新您的行标记为 strong

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

    pandoc.table(n)
    pander(n)       # S3 method
    
  5. 将降价转换为例如具有brew语法的HTML:

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

  6. 更新:我已更新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上托管的最新版本中找到。

答案 1 :(得分:18)

这是一个基于xtable并带有自定义css的解决方案。我认为解决方案很灵活,因为一旦你开始工作,如果你知道一些css技巧,你可以无限期地自定义你的html表。

我们走了。该解决方案包含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. 用于设置RStudio markdown的R脚本文件,其中包含以下内容:

    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')
    ```
    
  4. 最后使用knit HTML按钮将markdwon转换为html,你应该得到这样的结果:

    enter image description here