Creazione di tabelle Markdown in modo programmatico in R con KnitR

Sto appena iniziando a conoscere KnitR e l’uso di Markdown nella generazione di documenti e rapporti R. Questo sembra essere perfetto per un sacco di rapporti giornalieri che ho a che fare con il mio lavoro. Tuttavia, una cosa che non vedo è un modo semplice per stampare frame e tabelle di dati usando la formattazione Markdown (un po ‘come xtable , ma con Markdown al posto di LaTeX o HTML). So che posso semplicemente incorporare l’output HTML da xtable, ma mi stavo chiedendo se ci fossero delle soluzioni basate su Markdown?

Ora il knitr (dalla versione 1.3) include la funzione kable per le tabelle di creazione:

 > library(knitr) > kable(head(iris[,1:3]), format = "markdown") | Sepal.Length| Sepal.Width| Petal.Length| |-------------:|------------:|-------------:| | 5,1| 3,5| 1,4| | 4,9| 3,0| 1,4| | 4,7| 3,2| 1,3| | 4,6| 3,1| 1,5| | 5,0| 3,6| 1,4| | 5,4| 3,9| 1,7| 

AGGIORNATO : se ottieni un markdown raw in un documento prova i results = "asis" opzione results = "asis" .

Due pacchetti che faranno questo sono pander

 library(devtools) install_github('pander', 'Rapporter') 

O ascii

pander è un approccio leggermente diverso per segnalare la costruzione, (ma può essere utile per questa funzione).

ascii ti permetterà di print con type = 'pandoc (o vari altri gusti type = 'pandoc )

 library(ascii) print(ascii(head(iris[,1:3])), type = 'pandoc')  **Sepal.Length**  **Sepal.Width**  **Petal.Length** --- ------------------ ----------------- ------------------ 1  5.10        3.50        1.40       2  4.90        3.00        1.40       3  4.70        3.20        1.30       4  4.60        3.10        1.50       5  5.00        3.60        1.40       6  5.40        3.90        1.70       --- ------------------ ----------------- ------------------ 

Nota che in entrambi i casi, è diretto all’uso di pandoc per convertire dal pandoc al tipo di documento desiderato, tuttavia usando style='rmarkdown' creerai tabelle che sono compatibili con questo pacchetto rstudio e la conversione incorporata in rstudio .

Volevo solo aggiornare questo con quello che ho deciso di fare. Sto usando il pacchetto hwriter in questo momento per stampare le tabelle e usare le funzioni row.* E col.* Per mettere le classi CSS su elementi diversi. Quindi, ho scritto CSS personalizzati per rendere la mia visualizzazione come volevo. Quindi, ecco un esempio nel caso in cui qualcun altro ha a che fare con qualcosa di simile.

Innanzitutto, crea un file che eseguirà il knitting e modifica il Markdown in HTML:

 FILE: file_knit.r #!/usr/bin/env Rscript library(knitr) library(markdown) knit("file.Rmd") markdownToHTML("file.md","file.html",stylesheet="~/custom.css") 

Quindi, crea il file Markdown effettivo:

 FILE: file.Rmd Report of Fruit vs. Animal Choices ================================== This is a report of fruit vs. animal choices. ```{r echo=FALSE,results='asis'} library(hwriter) set.seed(9850104) my.df <- data.frame(Var1=sample(x=c("Apple","Orange","Banana"),size=40,replace=TRUE), Var2=sample(x=c("Dog","Cat","Bunny"),size=40,replace=TRUE)) tbl1 <- table(my.df$Var1,my.df$Var2) tbl1 <- cbind(tbl1,rowSums(tbl1)) tbl1 <- rbind(tbl1,colSums(tbl1)) colnames(tbl1)[4] <- "TOTAL" rownames(tbl1)[4] <- "TOTAL" # Because I used results='asis' for this chunk, I can just use cat() and hwrite() to # write out the table in HTML. Using hwrite()'s row.* function, I can assign classes # to the various table elements. cat(hwrite(tbl1, border=NA, table.class="t1", row.class=list(c("header col_first","header col","header col","header col", "header col_last"), c("col_first","col","col","col","col_last"), c("col_first","col","col","col","col_last"), c("col_first","col","col","col","col_last"), c("footer col_first","footer col","footer col","footer col","footer col_last")))) ``` 

Infine, basta creare un file CSS personalizzato.

 FILE: custom.css body { font-family: sans-serif; background-color: white; font-size: 12px; margin: 20px; } h1 {font-size:1.5em;} table { border: solid; border-color: black; border-width: 2px; border-collapse: collapse; margin-bottom: 20px; text-align: center; padding: 0px; } .t1 .header { color: white; background-color: black; border-bottom: solid; border-color: black; border-width: 2px; font-weight: bold; } .t1 .footer { border-top: solid; border-color: black; border-width: 2px; } .t1 .col_first { border-right: solid; border-color: black; border-width: 2px; text-align: left; font-weight: bold; width: 75px; } .t1 .col { width: 50px; } .t1 .col_last { width: 50px; border-left: solid; border-color: black; border-width: 2px; } 

L'esecuzione ./file_knit.r mi dà file.html, che assomiglia a questo:

Esempio di output

Quindi, si spera che questo possa essere utile per gli altri che vogliono un po 'più di formattazione nell'output di Markdown!

Ci sono funzioni nel pacchetto pander :

 > library(pander) > pandoc.table(head(iris)[, 1:3]) ------------------------------------------- Sepal.Length Sepal.Width Petal.Length -------------- ------------- -------------- 5.1 3.5 1.4 4.9 3 1.4 4.7 3.2 1.3 4.6 3.1 1.5 5 3.6 1.4 5.4 3.9 1.7 ------------------------------------------- 

Non è molto difficile creare la tua funzione personalizzata. Ecco una semplice dimostrazione del concetto per generare una tabella rmarkdown di un data.frame :

  rmarkdownTable <- function(df){ cat(paste(names(df), collapse = "|")) cat("\n") cat(paste(rep("-", ncol(df)), collapse = "|")) cat("\n") for(i in 1:nrow(df)){ cat(paste(df[i,], collapse = "|")) cat("\n") } invisible(NULL) } 

Nel documento .Rmd dovresti usare la funzione con results = 'asis' :

 ```{r, results = 'asis'} rmarkdownTable <- function(df){ cat(paste(names(df), collapse = "|")) cat("\n") cat(paste(rep("-", ncol(df)), collapse = "|")) cat("\n") for(i in 1:nrow(df)){ cat(paste(df[i,], collapse = "|")) cat("\n") } invisible(NULL) } rmarkdownTable(head(iris)) ``` 

Il codice sopra ti darà la seguente figura (nell'esempio questo è l'output pdf, ma dato che la tabella è in markdwon, potresti anche lavorare in html o word).

inserisci la descrizione dell'immagine qui Da qui - e leggendo il codice di altre persone - puoi capire come manipolare il testo per generare il tavolo che desideri e creare funzioni più personalizzate.

usa una combinazione di knitr :: kable e xtable nel tuo documento markdown.

 library("knitr","xtable") 

per un semplice data.frame –

 kable(head(mtcars[,1:4]),format="markdown") kable(head(mtcars[,1:4]),format="pandoc",caption="Title of the table") 

format="pandoc" consente più opzioni come didascalia.

Ora la combinazione per il riepilogo del modello .

 data(tli) fm1 <- aov(tlimth ~ sex + ethnicty + grade + disadvg, data=tli) kable(xtable(fm1), caption = "Annova table") 

per ancora più opzioni guarda il pacchetto di stargazer invece di xtable .

esempio per uso personale

Per scrivere / creare tabelle Markdown in R, puoi anche utilizzare le MarkDown_Table_writer_DF_RowColNames() o MarkDown_Table_writer_NamedVector() . È sufficiente passare un frame / matrice dati con nomi di dimensioni o un vettore con nomi e analizza e scrive la tabella in formato Markdown.