105 votes

Créer des tableaux Markdown de manière programmée en R avec KnitR

Je viens tout juste de commencer à apprendre à propos de KnitR et de l'utilisation de Markdown pour générer des documents et des rapports en R. Cela semble parfait pour beaucoup des rapports quotidiens que je dois faire dans mon travail. Cependant, une chose que je ne semble pas voir est un moyen simple d'imprimer des data frames et des tables en utilisant le format Markdown (un peu comme xtable, mais avec Markdown au lieu de LaTeX ou HTML). Je sais que je peux simplement incorporer la sortie HTML de xtable, mais je me demandais s'il existait des solutions basées sur Markdown?

3 votes

En considérant xtable et html.. Impression du code html avec print(xtable(data), type = "html").

7 votes

@TARehman Ta question m'a rappelé qu'il n'y avait toujours pas de solution qui produisait des tables directement compatibles avec knitr, donc j'ai envoyé une requête de fusion à pander pour ajouter le style de table. Dans les prochaines versions de pander, vous devriez pouvoir faire pandoc.table(iris, style="rmarkdown")

1 votes

@Marius Savez-vous pourquoi pandoc ne fait pas partie de CRAN ? Ou quand il pourrait en devenir partie ? Juste curieux.

124voto

Artem Klevtsov Points 1049

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

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

À JOUR : si vous obtenez des balises markdown brutes dans un document, essayez de configurer l'option de chunk results = "asis".

25 votes

Lors de l'exécution à l'intérieur de knitr, vous pouvez omettre l'argument format, car knitr est conscient du format de sortie et le définira automatiquement

0 votes

Génial. Ça a l'air super!

4 votes

@Yihui Vous êtes incroyable

32voto

mnel Points 48160

Deux packages qui feront cela sont pander

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

Ou ascii

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

ascii vous permettra d'utiliser print avec type = 'pandoc (ou diverses autres saveurs de markdown)

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

Remarquez que dans ces deux cas, l'utilisation de pandoc est recommandée pour convertir du markdown vers votre type de document désiré, cependant l'utilisation de style='rmarkdown' créera des tables compatibles avec ce package markdown et la conversion intégrée dans rstudio.

3 votes

Juste une note à propos de pander : il peut produire aussi les tables stylisées rmarkdown en plus d'autres, par exemple : pander(head(iris[,1:3]), style = 'rmarkdown')

0 votes

@daroczig -- Merci et noté dans la réponse maintenant,

26voto

TARehman Points 1775

Je voulais juste mettre à jour ceci avec ce que j'ai décidé de faire. J'utilise actuellement le package hwriter pour imprimer des tables et j'utilise les fonctionnalités row.* et col.* pour ajouter des classes CSS à différents éléments. Ensuite, j'ai écrit du CSS personnalisé pour afficher comme je le voulais. Donc, voici un exemple au cas où quelqu'un d'autre rencontre quelque chose de similaire.

Tout d'abord, créez un fichier qui fera le knitting et convertira le Markdown en HTML :

FICHIER : 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 réel :

FICHIER: file.Rmd
Rapport sur les choix de fruits vs. d'animaux
==================================

Il s'agit d'un rapport sur les choix de fruits vs. d'animaux.

```{r echo=FALSE,results='asis'}
library(hwriter)
set.seed(9850104)
my.df <- data.frame(Var1=sample(x=c("Pomme","Orange","Banane"),size=40,replace=TRUE),
                    Var2=sample(x=c("Chien","Chat","Lapin"),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"

# Parce que j'ai utilisé results='asis' pour ce chunk, je peux simplement utiliser cat() et hwrite() 
# pour écrire le tableau en HTML. En utilisant la fonction row.* de hwrite(), je peux assigner des classes
# aux différents éléments du tableau.
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é.

FICHIER : 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écuter ./file_knit.r me donne file.html, qui ressemble à ceci :

Exemple de sortie

Donc, j'espère que cela pourra être utile à d'autres qui veulent un peu plus de mise en forme dans la sortie Markdown !

1 votes

Oui, non. Va fonctionner avec Markdown --> HTML mais pas avec Markdown --> PDF, Markdown --> DOCX ... La question concerne l'utilisation de Markdown en général, pas seulement dans le but de créer des fichiers HTML avec cela - pourrait avoir été votre intention, mais ce n'est pas écrit là.

0 votes

Avez-vous remarqué que je réponds à ma propre question? Je peux modifier la question ou la taguer différemment si vous pensez que cela aiderait?

0 votes

Soit dit en passant, au moment de cette réponse, knitr ne supportait que HTML. C'est pourquoi la question ne mentionne pas explicitement le HTML.

18voto

Marius Points 8425

Il y a des fonctions dans le package 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      
-------------------------------------------

4 votes

Merci de promouvoir pander :) Veuillez noter que vous pouvez également utiliser la méthode générique S3 pour gagner quelques caractères à taper, comme: pander(head(iris)[, 1:3])

13voto

Carlos Cinelli Points 1872

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 un tableau 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 ensuite 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 la figure suivante (dans l'exemple, il s'agit de la sortie pdf, mais comme le tableau est en markdwon, vous pourriez également le convertir en html ou en word).

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X