web-dev-qa-db-fra.com

Comment imprimer (sur papier) un bloc de données bien formaté

J'aimerais imprimer des cadres de données bien formatés sur du papier, idéalement à partir d'un script. (J'essaie de collecter des données à l'aide d'un instrument et de les traiter et de les imprimer automatiquement à l'aide d'un script R).

À l'heure actuelle, je peux écrire un cadre de données dans un fichier texte en utilisant write.table(), mais cela pose deux problèmes:

  1. Le fichier texte résultant est mal formaté (les colonnes ne sont pas nécessairement alignées avec leurs en-têtes) et
  2. Je ne sais pas comment imprimer un fichier texte à partir de R.

Je suis plus à la recherche de stratégies générales que de codes spécifiques (même si le code serait bien aussi!). Sweave serait-il la solution la plus pratique? En principe, est-ce que je peux utiliser socketConnection() pour imprimer sur une imprimante - et si oui, où puis-je apprendre à l'utiliser (je n'ai pas trouvé la documentation très utile).

76
Drew Steen

Voici une possibilité simple et rapide en utilisant grid.table À partir du paquet gridExtra:

library(gridExtra)
pdf("data_output.pdf", height=11, width=8.5)
grid.table(mtcars)
dev.off()

enter image description here

Si vos données ne tiennent pas sur la page, vous pouvez réduire la taille du texte grid.table(mtcars, gp=gpar(fontsize=8)). Cela peut ne pas être très flexible, ni facile à généraliser ou à automatiser.

98
bdemarest

Je suggérerais xtable en combinaison avec les documents LaTeX. Regardez les exemples de ceci pdf:

Vous pouvez aussi combiner directement ceci avec Sweave ou knitr .

16
smu

Le package printr est une bonne option pour imprimer data.frames, pages d’aide, listes de vignettes et listes de jeux de données dans knitr documents.

De la page de documentation :

options(digits = 4)
set.seed(123)
x = matrix(rnorm(40), 5)
dimnames(x) = list(NULL, head(LETTERS, ncol(x)))
knitr::kable(x, digits = 2, caption = "A table produced by printr.")
7
jsta

Surpris, personne n'a mentionné le paquetage stargazer pour une bonne impression des données.

Vous pouvez générer un fichier texte de belle apparence:

stargazer(mtcars, type = 'text', out = 'out.txt')

============================================
Statistic N   Mean   St. Dev.  Min     Max  
--------------------------------------------
mpg       32 20.091   6.027   10.400 33.900 
cyl       32  6.188   1.786     4       8   
disp      32 230.722 123.939  71.100 472.000
hp        32 146.688  68.563    52     335  
drat      32  3.597   0.535   2.760   4.930 
wt        32  3.217   0.978   1.513   5.424 
qsec      32 17.849   1.787   14.500 22.900 
vs        32  0.438   0.504     0       1   
am        32  0.406   0.499     0       1   
gear      32  3.688   0.738     3       5   
carb      32  2.812   1.615     1       8   
--------------------------------------------

Ou même HTML:

stargazer(mtcars, type = 'html', out = 'out.html')
<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Statistic</td><td>N</td><td>Mean</td><td>St. Dev.</td><td>Min</td><td>Max</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">mpg</td><td>32</td><td>20.091</td><td>6.027</td><td>10.400</td><td>33.900</td></tr>
<tr><td style="text-align:left">cyl</td><td>32</td><td>6.188</td><td>1.786</td><td>4</td><td>8</td></tr>
<tr><td style="text-align:left">disp</td><td>32</td><td>230.722</td><td>123.939</td><td>71.100</td><td>472.000</td></tr>
<tr><td style="text-align:left">hp</td><td>32</td><td>146.688</td><td>68.563</td><td>52</td><td>335</td></tr>
<tr><td style="text-align:left">drat</td><td>32</td><td>3.597</td><td>0.535</td><td>2.760</td><td>4.930</td></tr>
<tr><td style="text-align:left">wt</td><td>32</td><td>3.217</td><td>0.978</td><td>1.513</td><td>5.424</td></tr>
<tr><td style="text-align:left">qsec</td><td>32</td><td>17.849</td><td>1.787</td><td>14.500</td><td>22.900</td></tr>
<tr><td style="text-align:left">vs</td><td>32</td><td>0.438</td><td>0.504</td><td>0</td><td>1</td></tr>
<tr><td style="text-align:left">am</td><td>32</td><td>0.406</td><td>0.499</td><td>0</td><td>1</td></tr>
<tr><td style="text-align:left">gear</td><td>32</td><td>3.688</td><td>0.738</td><td>3</td><td>5</td></tr>
<tr><td style="text-align:left">carb</td><td>32</td><td>2.812</td><td>1.615</td><td>1</td><td>8</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr></table>
7
BLT

La solution grid.table sera en effet le moyen le plus rapide de créer un fichier PDF, mais ce ne sera peut-être pas la solution optimale si vous avez une table assez longue. RStudio + knitr + longtable facilitent la création de PDF bien formatés. Vous aurez besoin de quelque chose comme:

\documentclass{article}
\usepackage{longtable}
\begin{document}

<<results='asis'>>=
library(xtable)

df = data.frame(matrix(rnorm(400), nrow=100))
xt = xtable(df)
print(xt, 
      tabular.environment = "longtable",
      floating = FALSE
      )
@
\end{document}

Pls voir this post pour plus de détails.

6
Thusi

Le RStudio IDE donne une autre option intéressante pour imprimer un fichier data.table:

  1. Ouvrez les données dans la visionneuse, par exemple. View(data_table) ou via l'interface graphique
  2. Ouvrir la vue dans une fenêtre séparée (icône dans le coin supérieur gauche: "Afficher dans une nouvelle fenêtre")
  3. La fenêtre séparée supporte maintenant une boîte de dialogue d'impression (avec aperçu)

Cela fonctionne dans RStudio V0.98.1103 (et probablement dans les versions les plus récentes)

4
kirk

Pas aussi sophistiqué, mais très utilitaire:

print.data.frame(iris)
4
jclouse

Pour tables longues/larges , vous pouvez utiliser pander .

Il divisera automatiquement les longues tables en parties plus courtes qui correspondent à la page, par exemple. en utilisant knitr insérez ce morceau dans votre fichier Rmd:

pander::pander(mtcars)

enter image description here

Si vous voulez quelque chose qui ressemble plus à des tableaux Excel (même avec des options d'édition en HTML), utilisez rhandsontable . Plus d'informations sur l'utilisation et le formatage dans la vignette . Vous devrez tricoter votre Rmd dans un fichier html:

library(rhandsontable)
rhandsontable(mtcars, rowHeaders = NULL)

enter image description here

3
epo3

Je suis tombé sur cette question en cherchant à faire quelque chose de similaire. J'ai trouvé la mention de la commande sink ailleurs sur stackoverflow qui était utile dans ce contexte:

sink('myfile.txt')
print(mytable,right=F)
sink()
1
JamesF

Si vous voulez exporter en png, vous pouvez faire comme ceci:

library(gridExtra)
png("test.png", height = 50*nrow(df), width = 200*ncol(df))
grid.table(df)
dev.off()

Si vous souhaitez exporter au format PDF, vous pouvez procéder comme suit:

library(gridExtra)
pdf("test.pdf", height=11, width=10)
grid.table(df)
dev.off()
0
Ning