2014-12-30 12 views
16

È possibile applicare un attributo di classe a singole celle di tabella utilizzando knitr? Ho applicato con successo un attributo di classe all'intestazione della sezione che contiene una tabella generata knitr::kable e utilizzata per formattare l'intera tabella. Tuttavia, mi piacerebbe poter formattare condizionatamente singole celle che richiederebbero la possibilità di applicare una classe a specifici elementi <td>.Posso usare knitr per applicare gli stili CSS alle singole celle di una tabella?

La mia soluzione attuale è di avvolgere a livello di codice il contenuto della cella in una coppia di tag <span> e passarla a knitr::kable. Questo approccio mi consente solo di formattare il testo all'interno della cella rispetto all'intera cella (ad esempio impostando il colore di sfondo della cella). Ecco un esempio di quello che sto attualmente in uso:

## Read in the report, process the data, send to kable 
rpt <- generate.report() 
mutate(rpt, Col2 = ifelse(abs(Col2) > Threshold, 
          paste('<span class="warning">', 
           sprintf("%.2f", Col2), '</span>'), 
          sprintf("%.2f", Col2))) %>% 
    knitr::kable(format="markdown", align = c("l", rep("r", 4)), 
       col.names = gsub("\\.", "<br>", colnames(.))) 

che si traduce nel seguente esempio di output HTML:

<td align="right"><span class="warning"> -1.74 </span></td> 

Vorrei essere in grado di avere knitr :: kable generare qualcosa di simile :

<td align="right" class="warning"> -1.74 </td> 

In questo modo ho potuto applicare stili CSS al tag <td> vizio del tag <span>.

+0

Se gli stili grassetto/corsivo sono sufficienti per il tuo caso d'uso, allora 'pander' offre una soluzione piuttosto user-friendly per questo: http://rapporter.github.io/pander/#highlighting-cells E ovviamente potresti modificare l'aspetto forte/corsivo con JS/CSS, quindi la limitazione sopra menzionata significa semplicemente che puoi avere solo due stili extra in una tabella. Per favore fatemi sapere se è d'aiuto (menzionandomi nel commento, come @daroczig per una notifica via e-mail), e posso trovare un esempio riproducibile. – daroczig

+0

@daroczig Grazie per l'idea. Sfortunatamente, mentre il tuo suggerimento produce un buon risultato di markdown, come puoi affermare chiaramente, consente solo il forte/corsivo. Sto cercando una soluzione che consenta una maggiore flessibilità nell'applicazione di stili unici alle singole celle. –

+0

Un'idea a cui ho pensato è scrivere una funzione R che post-elaborerà l'output HTML generato da 'knitr :: kable' per trovare i tag' 'e rimuoverli e modificare i tag' 'parent. Ma se non dovessi passare attraverso quella complessità, mi piacerebbe utilizzare una soluzione esistente se disponibile. –

risposta

7

pacchetto ReporteRs può aiutare. Dai un'occhiata qui FlexTable.

È quindi possibile ottenere il codice HTML corrispondente con la funzione as.html e riutilizzarlo nel codice knitr.

+1

Ho dato un'occhiata a FlexTable e sono d'accordo che fornisce molti miglioramenti su Kable e molta personalizzazione. Purtroppo FlexTable applica tutta la formattazione utilizzando gli attributi di stile incorporati. Questo preclude l'utilizzo di fogli di stile CSS. (A meno che non manchi qualcosa dal pacchetto ReporeRs.) Esiste un modo per applicare gli attributi di classe invece degli attributi di stile usando FlexTable? O è una richiesta di funzionalità che dovrei inviare tramite GitHub? –

+0

Sfortunatamente non è possibile applicare gli attributi della classe css. –

0

Ok, questo potrebbe non essere la risposta ma potrebbe indirizzarti nella giusta direzione. Ho avuto un problema simile nella formattazione di singole celle in knitr per preparare un pdf. Alla fine, uso xtable e scrivo una funzione basata su una matrice logica per decidere se una cella nella tabella di output debba essere formattata o meno.

Non riuscivo a farlo funzionare correttamente da solo, quindi ho dovuto postarlo qui e con l'aiuto di ivyleavedtoadflax sono stato in grado di sviluppare una funzione ragionevolmente facile da usare per applicare la formattazione a determinate celle in un xtable in knitr.

Here's the link to my post

come ho detto, non è la soluzione esatta al vostro problema ma può puntare nella giusta direzione.

+0

Il problema con il pacchetto xtable, così come con il Flextable di ReporteRs, è che il formato di tabella predefinito non è carino e richiede molto lavoro da parte dell'utente, specialmente quando vengono utilizzate molte tabelle in un report. Il punto della mia generosità è trovare una soluzione che permetta la formattazione a livello cellulare senza perdere i vantaggi della funzione kable(). –

Problemi correlati