Crear tablas de Markdown mediante progtwigción en R con KnitR

Estoy empezando a aprender sobre KnitR y el uso de Markdown en la generación de documentos e informes R Esto parece ser perfecto para la mayoría de los informes del día a día que tengo que ver con mi trabajo. Sin embargo, una cosa que no veo es una forma fácil de imprimir marcos de datos y tablas usando el formato Markdown (algo así como xtable , pero con Markdown en lugar de LaTeX o HTML). Sé que puedo insertar la salida HTML de xtable, pero me preguntaba si había alguna solución basada en Markdown.

Ahora el knitr (desde la versión 1.3) incluye la función kable para las tablas de creación:

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

ACTUALIZADO : si obtiene el descuento bruto en un documento, intente los results = "asis" configuración results = "asis" opción de fragmento results = "asis" .

Dos paquetes que harán esto son pander

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

O ascii

pander es un enfoque ligeramente diferente para la construcción de informes, (pero puede ser útil para esta característica).

ascii le permitirá print con type = 'pandoc (o varios otros sabores de 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       --- ------------------ ----------------- ------------------ 

Tenga en cuenta que en ambos casos, está dirigido hacia el uso de pandoc para convertir de pandoc al tipo de documento deseado, sin embargo, si utiliza style='rmarkdown' se crearán tablas que sean compatibles con este paquete de markdown y la conversión incorporada en rstudio .

Solo quería actualizar esto con lo que decidí hacer. Estoy usando el paquete de hwriter ahora mismo para imprimir tablas y usar las características de la row.* Y col.* Para poner clases de CSS en diferentes elementos. Luego, escribí un CSS personalizado para hacer mi visualización como yo quería. Entonces, aquí hay un ejemplo en caso de que alguien más esté lidiando con algo similar.

Primero, crea un archivo que hará knitting y cambia el Markdown en HTML:

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

A continuación, crea el archivo de reducción real:

 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")))) ``` 

Finalmente, solo crea un archivo CSS personalizado.

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

Ejecutar ./file_knit.r me da file.html, que se ve así:

Ejemplo de salida

Entonces, con suerte, esto podría ser útil para otros que quieran un poco más de formato en la salida de Markdown.

Hay funciones en el paquete 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 ------------------------------------------- 

No es muy difícil hacer su propia función personalizada. Aquí hay una prueba de concepto muy simple para generar una tabla de data.frame de 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) } 

En el documento .Rmd, entonces usaría la función 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)) ``` 

El código anterior le daría la siguiente figura (en el ejemplo, esta es la salida en pdf, pero dado que la tabla está en markdwon, también puede tejer en html o word).

enter image description here Desde aquí, y leyendo el código de otras personas, puede descubrir cómo manipular el texto para generar la tabla que desea y crear funciones más personalizadas.

use una combinación de knitr :: kable y xtable en su documento de reducción.

 library("knitr","xtable") 

para un simple data.frame –

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

format="pandoc" permite más opciones como subtítulos.

Ahora la combinación para el resumen del modelo .

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

para más opciones, mira el paquete stargazer en lugar de xtable .

ejemplo para uso personal

Para escribir / crear tablas de Markdown en R, también puede usar las MarkDown_Table_writer_DF_RowColNames() o MarkDown_Table_writer_NamedVector() MarkdownReports . Simplemente transfiere un dataframe / matriz con nombres de dimensión, o un vector con nombres, y analiza y escribe la tabla en formato de Marcado.