2014-11-24 13 views
12

Sono praticamente un principiante nella formattazione programmatica dell'output R, ma ho una conoscenza di base della capacità di knitr, xtable, Markdown e Pandoc per la conversione di uno formato di marcatura a un altro. Quello che voglio fare è scrivere un dataframe R df in una tabella HTML e applicare un colore particolare a ciascuna riga che soddisfa una condizione (ad es., df$outcome == 1). Tuttavia, non sono sicuro di quale pacchetto possa ottenere questo risultato in modo semplice ed efficiente, ma sfogliando alcuni thread di formattazione della tabella (xtable thread 1, xtable thread 2, kable documentation 1), ho notato che kable e xtable potrebbero essere in grado di realizzare il mio desiderato risultato.R - Evidenziazione di riga condizionale nella tabella HTML creata usando xtable o kable

Per chiarire, ecco il mio esempio riproducibile (usando xtable, ma sono interessati a una risposta utilizzando kable o un altro pacchetto pure):

set.seed(123) 
df <- data.frame(id  = sample(1:100, 20, replace = TRUE), 
       inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE), 
       outcome = sample(1:4, 20, replace = TRUE)) 

library(xtable) 
dfxt <- xtable(df) 

knit2html(input  = "~/rowcolor_ex.Rmd", 
      output  = OUTPUTHERE 
      stylesheet = "STYLESHEET.css") 

con knit2html riferimento il file denominato "rowcolor_ex.Rmd", illustrato di seguito:

```{r,echo=FALSE,results='asis',warning=FALSE,message=FALSE} 
print(dfxt, 
     type = "html", 
     include.rownames = FALSE,) 
``` 

ho capito che se voglio usare xtable, mi piacerebbe includere uno o più argomenti che seguono il print(dfxt, parte della chiamata di funzione nella 01.237.documento e this thread mostra l'argomento add.to.row che ha senso per type = "latex", ma non è chiaro come il codice cambierebbe per l'output HTML. Inoltre, non sono sicuro che il riferimento a un foglio di stile CSS in knit2html annullerebbe la formattazione della tabella HTML.

+1

[domanda simile merito sulle singole righe] (http://stackoverflow.com/questions/31323885/how-to-color-specific-cells-in-a-data-frame-table-in -r) – rawr

risposta

14

Ecco una soluzione che utilizza Gmisc::htmlTable

set.seed(123) 
df <- data.frame(id  = sample(1:100, 20, replace = TRUE), 
       inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE), 
       outcome = sample(1:4, 20, replace = TRUE)) 

cols <- with(df, ifelse(outcome == 1, 'magenta', 'white')) 

library(Gmisc) 
htmlTable(as.matrix(df), altcol = cols, 
      rgroup = '', n.rgroup = rep(1, length(cols))) 

EDIT

Da htmlTable è stata successivamente spostata nel pacchetto, htmlTable, e non più in Gmisc è> = 1.0, il nuovo modo per fare questo sarebbe

library('htmlTable') 
htmlTable(as.matrix(df), col.rgroup = cols) 

che dà anche:

enter image description here

e il tuo codice di riduzione dei prezzi sarebbe semplicemente

```{r, results='asis'} 
htmlTable(as.matrix(df), altcol = cols, 
      rgroup = '', n.rgroup = rep(1, length(cols))) 
``` 

E il mio .RMD sarà simile:

--- 
output: 
    html_document: 
    css: ~/knitr.css 
--- 

```{r, results='asis', message=FALSE} 
set.seed(123) 
df <- data.frame(id  = sample(1:100, 20, replace = TRUE), 
       inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE), 
       outcome = sample(1:4, 20, replace = TRUE)) 

cols <- with(df, ifelse(outcome == 1, 'magenta', 'white')) 

library(Gmisc) 
htmlTable(as.matrix(df), altcol = cols, 
      rgroup = '', n.rgroup = rep(1, length(cols))) 
``` 
+0

Meraviglioso! Una domanda però. Dato che sto usando un data.frame con vettori di più tipi, ho cambiato 'as.matrix (df)' in solo 'df', e ora la prima colonna è il nome della tabella (df) e include i numeri di riga. Come rimuovo questa colonna Rownumber? Grazie. – mcjudd

+1

'rownames (df) <- NULL' o' rownames (df) <- rep ('', nrow (df)) '. È solo mia abitudine trasformare tutto in una matrice in queste situazioni perché 1) puoi trasformare tutto in stringhe di caratteri in modo che l'output rispetti la tua formattazione e il numero di cifre; 2) è possibile utilizzare nomi di righe e colonne duplicati (non è possibile creare duplicati in data.frames, motivo per cui devono essere presenti se si utilizza un frame di dati, quindi perché coercitivo in genere in una matrice) – rawr

+0

Great, thanks. Inoltre, posso specificare un file .css da cui htmlTable legge e applica la formattazione corretta? Ho un file .css che si applica al resto della pagina HTML e voglio che le tabelle abbiano una formattazione uniforme, tranne ovviamente per le righe evidenziate con un colore diverso. Sembra che tableCSSclass = "table tr" 'possa ereditare il' table tr' CSS dal template CSS che chiamo in 'knit2HTML', ma vedo che la mia tabella mostra ancora la seguente classe:' Classes 'htmlTable', 'character' atomic [1: 1]

mcjudd

5

Be ', non usando i colori (come non supportata da Markdown), ma è possibile evidenziare cellule/righe/colonne della tabella con pandoc.table e la general pander method utilizzando grassetto o corsivo font face:

> library(pander) 
> emphasize.rows(which(df$outcome == 2)) 
> pander(df) 

------------------------- 
id inputval outcome 
---- ---------- --------- 
29  0.89  1  

*79* *0.69*  *2* 

*41* *0.64*  *2* 

*89* *1*  *2* 

95  0.66  1  

5  0.71  1  

53  0.54  1  

*90* *0.6*  *2* 

*56* *0.29*  *2* 

46  0.14  4  

96  0.97  1  

*46* *0.91*  *2* 

68  0.69  4  

58  0.8   1  

11  0.02  3  

90  0.48  1  

25  0.76  1  

5  0.21  4  

33  0.32  4  

*96* *0.23*  *2* 
------------------------- 
1

Ecco una soluzione che utilizza ReporteRs:

set.seed(123) 
df <- data.frame(id = sample(1:100, 20, replace = TRUE), 
    inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE), 
    outcome = sample(1:4, 20, replace = TRUE)) 

library(ReporteRs) 
library(magrittr) 

# create and format table 
myft = df %>% FlexTable() %>% 
    setRowsColors(df$outcome == 1, 'magenta') %>% 
    setFlexTableWidths(c(1, 1, 1)) 

# create an html doc and send myft into 
doc = bsdoc() %>% addFlexTable(myft) 

# write the html file in a new dir 
writeDoc(doc, "example_out/df.html") 
1

Ho giocato intorno ad una buona quantità di documenti formattazione RMarkdown.

Poiché RMarkdown viene convertito in LaTeX prima che venga generato il PDF finale, è possibile passare argomenti che potrebbero funzionare in LaTeX su RMarkdown. Quindi, aggiungendo

header-includes: 
    - \usepackage{xcolor} 

nel titolo del documento RMarkdown, e quindi l'aggiunta di qualcosa di simile a

for(i in seq(1, nrow(yourDataframe), by = 2)){ 
    yourDataframe[i, ] <- paste0("\\color{purple}", yourDataframe[i, ]) 
    row.names(yourDataframe)[i] <- paste0("\\color{purple}", row.names(yourDataframe)[i]) 
} 

ti porterà viola (o qualsiasi colore specificato e consentito nel pacchetto LaTeX xcolor) voci in ogni altra fila del tuo tavolo. Solo un altro modo per enfatizzare le voci che non sono il grassetto o il corsivo di base.

Questa non è l'evidenziazione di riga, ma potrebbe fornire ulteriori opzioni personalizzabili.

* Testato con il pacchetto pander.

** Per questo metodo è necessario convertire colonne di fattori in colonne di caratteri.

Output

Problemi correlati