2014-12-30 8 views
16

Kann ein Klassenattribut mit knitr auf einzelne Tabellenzellen angewendet werden? Ich habe erfolgreich ein Klassenattribut auf die Abschnittsüberschrift angewendet, die eine knitr::kable generierte Tabelle enthält und diese zum Formatieren der gesamten Tabelle verwendet. Ich möchte jedoch in der Lage sein, einzelne Zellen bedingt zu formatieren, die eine Klasse auf spezifische Elemente anwenden müssten.Kann ich mit knitr CSS-Stile auf einzelne Tabellenzellen anwenden?

Meine aktuelle Problemumgehung besteht darin, programmgesteuert den Zellinhalt in einem Paar <span> Tags zu umbrechen und das an knitr::kable weiterzugeben. Dieser Ansatz erlaubt mir nur, den Text innerhalb der Zelle gegenüber der gesamten Zelle zu formatieren (z. B. Einstellen der Zellenhintergrundfarbe). Hier ist ein Beispiel dafür, was ich zur Zeit mit:

## 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(.))) 

, die in dem folgenden Beispiel HTML-Ausgabe führt:

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

Ich möchte in der Lage sein zu haben knitr :: Kable erzeugen so etwas wie dieses :

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

So kann ich CSS-Stile auf den <td> Tag umge den <span> Tag anwenden könnte.

+0

Wenn fett/kursive Stile für Ihren Anwendungsfall ausreichen, dann bietet 'pander' eine eher benutzerfreundliche Lösung dafür: http://rapporter.github.io/pander/#highlighting-cells Und natürlich könnten Sie Optimieren Sie, wie strong/kursiv mit JS/CSS aussieht, daher bedeutet die oben genannte Einschränkung, dass Sie nur zwei zusätzliche Stile in einer Tabelle haben können. Bitte lassen Sie mich wissen, wenn es hilft (indem Sie mich im Kommentar erwähnen, wie @daroczig für eine E-Mail-Benachrichtigung), und ich kann ein reproduzierbares Beispiel finden. – daroczig

+0

@daroczig Danke für die Idee. Leider, während Ihr Vorschlag einen schönen Abschlag produziert, wie Sie klar sagen, erlaubt es nur stark/kursiv. Ich suche nach einer Lösung, die eine größere Flexibilität beim Anwenden einzigartiger Stile auf einzelne Zellen ermöglicht. –

+0

Eine Idee, über die ich nachgedacht habe, ist eine R-Funktion zu schreiben, die die 'knitr :: kable' generierte HTML-Ausgabe nachbearbeitet, um die' ' Tags zu finden und sie zu entfernen und die übergeordneten '' Tags zu editieren. Aber wenn ich diese Komplexität nicht durchgehen muss, würde ich gerne eine vorhandene Lösung verwenden, wenn eine verfügbar ist. –

Antwort

7

Paket ReporteRs kann helfen. Schau mal hier FlexTable.

Sie können dann den entsprechenden HTML-Code mit der Funktion as.html abrufen und in Ihrem Code knitr wiederverwenden.

+1

Ich habe mir FlexTable angeschaut und ich stimme zu, dass es eine Menge Verbesserungen gegenüber kable und viel Anpassung bietet. Leider wendet FlexTable alle Formatierungen mit eingebetteten Stilattributen an. Dies schließt die Verwendung von CSS-Stylesheets aus. (Es sei denn, mir fehlt etwas aus dem ReporterRs-Paket.) Gibt es eine Möglichkeit, Klassenattribute anstelle von Stilattributen mithilfe von FlexTable anzuwenden? Oder ist das eine Feature-Anfrage, die ich über GitHub einreichen sollte? –

+0

Leider ist es nicht möglich, css-Klassenattribute anzuwenden. –

0

Ok, dies ist möglicherweise nicht die Antwort, aber es kann Sie in die richtige Richtung zeigen. Ich hatte ein ähnliches Problem beim Formatieren einzelner Zellen in Knitr, um ein PDF zu erstellen. Am Ende benutze ich xtable und schrieb eine Funktion, die sich auf eine logische Matrix verließ, um zu entscheiden, ob eine Zelle in der Ausgabetabelle formatiert werden würde oder nicht.

Ich konnte es nicht ganz reibungslos von mir selbst arbeiten, also musste ich es hier veröffentlichen und mit Hilfe von ivyleavedtoadflax konnte ich eine einigermaßen einfach zu bedienende Funktion entwickeln, um Formatierung auf bestimmte Zellen in einem xtable anzuwenden in Knitr.

Here's the link to my post

Wie gesagt, es ist nicht die exakte Lösung für Ihr Problem, aber es kann Sie in die richtige Richtung weisen.

+0

Das Problem mit dem Paket xtable, sowie mit dem Flextable der Reporter ist, dass das Standardtabellenformat nicht nett ist und viel Arbeit von der Benutzerseite erfordert, besonders wenn viele Tabellen in einem Bericht verwendet werden. Der Sinn meines Angebots ist es, eine Lösung zu finden, die das Formatieren auf Zellenebene ermöglicht, ohne die Vorteile der Funktion kable() zu verlieren. –

Verwandte Themen