19

我有一个数据框,我想通过 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 表格,那就太好了,但如果没有图像也可以。

4

2 回答 2

24

我一直想pandoc.table在我的pander 包中扩展这个功能,但没有时间去做。但是这个问题真的很鼓舞人心,可能会在接下来的几天内完成。在那之前,怎么办:

  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. brew使用语法将降价转换为例如 HTML :

    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 上托管的最新版本中找到。

于 2013-03-14T08:45:56.037 回答
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. 一个 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转换为html knit HTML,你应该得到这样的东西:

在此处输入图像描述

于 2013-03-14T09:08:25.827 回答