Создание таблиц с условным форматированием с помощью RMarkdown + knitr

17

У меня есть кадр данных, и я хочу вывести его в файл HTML через knitr и RMarkdown в виде таблицы с условным форматированием. Пример:

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-таблицей, но при этом не получилось бы и изображения.

    
задан mchangun 14.03.2013 в 08:57
источник

2 ответа

22

Я всегда хотел расширить 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. Обновите свои строки, которые будут отмечены как strong в 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 .

    
ответ дан daroczig 14.03.2013 в 09:45
источник
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 в html, используя кнопку knit HTML , и вы должны получить что-то вроде этого:

    
ответ дан agstudy 14.03.2013 в 10:08
источник