web-dev-qa-db-fra.com

Création par programme de tables de Markdown dans R avec KnitR

Je commence tout juste à apprendre à connaître KnitR et l'utilisation de Markdown pour générer des documents et des rapports R. Cela semble être parfait pour la plupart des rapports quotidiens que je dois faire avec mon travail. Cependant, une chose que je ne vois pas est un moyen facile d’imprimer des cadres de données et des tableaux en utilisant la mise en forme Markdown (un peu comme xtable, mais avec Markdown au lieu de LaTeX ou HTML). Je sais que je peux simplement intégrer la sortie HTML d'xtable, mais je me demandais s'il existait des solutions basées sur Markdown?

100
TARehman

Maintenant, le package knitr (depuis la version 1.3) inclut la fonction kable pour les tables de création:

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

MIS À JOUR : si vous obtenez un démarquage brut dans un document, essayez la configuration de l'option results = "asis" chunk.

118
Artem Klevtsov

Deux paquets qui feront cela sont pander

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

Ou ascii

pander est une approche légèrement différente de la construction de rapport (mais peut être utile pour cette fonctionnalité).

ascii vous permettra de print avec type = 'pandoc (ou divers autres types de démarques)

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

Notez que dans ces deux cas, il est dirigé vers l’utilisation de pandoc pour convertir le type de document au format souhaité, mais en utilisant style='rmarkdown' créera des tables compatibles avec ce paquet markdown et une conversion intégrée dans rstudio.

31
mnel

Je voulais juste mettre à jour cela avec ce que j'ai décidé de faire. J'utilise actuellement le paquetage hwriter pour imprimer des tableaux, et j'utilise le paquetage row.* et col.* fonctionnalités pour mettre des classes CSS sur différents éléments. Ensuite, j'ai écrit un CSS personnalisé pour que mon affichage soit tel que je le voulais. Donc, voici un exemple au cas où quelqu'un d'autre aurait affaire à quelque chose de similaire.

Tout d’abord, créez un fichier qui fera le knitting et changerez le 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")

Ensuite, créez le fichier Markdown actuel:

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

Enfin, créez simplement un fichier CSS personnalisé.

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

Exécution ./file_knit.r me donne fichier.html, qui ressemble à ceci:

Example Output

Donc, espérons que cela pourrait être utile aux autres qui souhaitent un peu plus de formatage dans la sortie Markdown!

25
TARehman

Il y a des fonctions dans le paquet 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      
-------------------------------------------
18
Marius

Il n'est pas très difficile de créer votre propre fonction personnalisée. Voici une preuve de concept très simple pour générer une table rmarkdown d'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)
    }

Dans le document .Rmd, vous utiliseriez alors la fonction avec 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))
```

Le code ci-dessus vous donnerait le chiffre suivant (dans l'exemple, c'est la sortie pdf, mais comme la table est en markdwon, vous pouvez aussi tricoter en HTML ou en Word).

enter image description here À partir de là - et en lisant le code des autres personnes - vous pouvez comprendre comment manipuler le texte pour générer le tableau souhaité et créer des fonctions plus personnalisées.

12
Carlos Cinelli

utilisez une combinaison de knitr :: kable et xtable dans votre document de démarquage.

library("knitr","xtable")

pour 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" permet plus d'options comme la légende.

Maintenant, la combinaison pour résumé du modèle .

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

pour encore plus d'options, regardez stargazer package à la place de xtable.

exemple pour usage personnel

3
Pankil Shah

Pour écrire/créer des tables de Markdown dans R, vous pouvez également utiliser les fonctions MarkdownReports 'MarkDown_Table_writer_DF_RowColNames() ou MarkDown_Table_writer_NamedVector(). Vous venez de transmettre un cadre/matrice de données avec des noms de dimension, ou un vecteur avec des noms, et l'analyse et l'écriture de la table au format Markdown.

1
bud.dugong