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:
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).
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()
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.
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.")
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>
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.
Le RStudio IDE donne une autre option intéressante pour imprimer un fichier data.table:
View(data_table)
ou via l'interface graphiqueCela fonctionne dans RStudio V0.98.1103 (et probablement dans les versions les plus récentes)
Pas aussi sophistiqué, mais très utilitaire:
print.data.frame(iris)
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)
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)
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()
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()