2013-03-14 28 views
17

Ho un frame di dati e voglio emetterlo in un file HTML tramite knitr e RMarkdown come tabella con formattazione condizionale. Esempio:Creare tabelle con formattazione condizionale con 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 

Desidero evidenziare righe con valori diversi di xey. Quindi, in questo caso, sarebbero le righe 1, 3 e 5. Sarebbe bello se l'output nel file HTML fosse una tabella HTML, ma in caso contrario anche un'immagine andrebbe bene.

+0

http://stackoverflow.com/questions/25315309/conditional-formatting-tables-in-rmarkdown-documents suggerisce il pacchetto ReportRs, FlexTable – rescdsk

risposta

22

Ho sempre voluto estendere pandoc.table nel mio pander package con questa funzione, ma non sono riuscito a ottenere il tempo per quello. Ma questa domanda è davvero stimolante, probabilmente lo farò nei prossimi giorni. Fino ad allora, che dire:

  1. caricare il pacchetto:

    library(pander) 
    
  2. caricare i dati:

    n <- data.frame(x = c(1,1,1,1,1), y = c(0,1,0,1,0)) 
    
  3. Aggiorna il tuo linee di essere contrassegnati come forte in Pandoc:

    for (i in c(1, 3, 5)) 
        n[i, ] <- pandoc.strong.return(n[1, ]) 
    
  4. mostra la versione mark-down della tabella:

    pandoc.table(n) 
    pander(n)  # S3 method 
    
  5. Covert il mark-down per esempio HTML con brew sintassi:

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

Update: Ho aggiornato pander prendere alcune nuove argomentazioni per evidenziare righe/colonne/cellule facilmente. Anche se sto ancora lavorando su alcune altre funzioni di supporto per rendere questo processo più semplice, qui va un demo veloce in modo che si potrebbe vedere come potrebbe aiutare il vostro flusso di lavoro:

> 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 
----------- 

Aggiornamento:pander guadagnato un po ' funzioni di aiuto per evidenziare le celle nelle tabelle ancora più facile:

> 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 
---------------------------------------------------- 

O direttamente con pander metodo:

> 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 
--------------------------------------------------------- 

Si prega di notare che queste nuove funzionalità non sono ancora pubblicate su CRAN, ma è possibile trovare nella versione più recente ospitata su GitHub.

17

Qui una soluzione basata su xtable con un numero personalizzato css. Penso che la soluzione sia flessibile poiché una volta che si ottiene il lavoro, è possibile personalizzare le tabelle html indefinitamente se si conoscono alcuni trucchi css.

Eccoci.La soluzione consiste in 3 file:

  1. un file css in cui si alterna il colore di riga della tabella.

    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. un file di script R per impostare Markdown RStudio con il seguente contenuto:

    options(rstudio.markdownToHTML = 
         function(inputFile, outputFile) {  
         require(markdown) 
         markdownToHTML(inputFile, outputFile, stylesheet='customstyle.css') 
         } 
    ) 
    
  3. creare una nuova riduzione dei prezzi con il seguente:

    ```{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') 
    ``` 
    

finalmente convertire il markdwon to html utilizzando il pulsante knit HTML e dovresti ottenere qualcosa di simile :

enter image description here

Problemi correlati