Jak wydrukować (na papier) ładnie sformatowaną ramkę danych

Chciałbym wydrukować ładnie sformatowane ramki danych na papier, najlepiej ze skryptu. (Staram się zbierać dane za pomocą instrumentu i automatycznie przetwarzać i drukować je za pomocą skryptu R).

W tej chwili mogę zapisać ramkę danych do pliku tekstowego używając write.table(), ale to ma dwa problemy:

  1. wynikowy plik tekstowy jest źle sformatowany (kolumny niekoniecznie pasują do swoich nagłówków) i
  2. Nie wiem jak wydrukować plik tekstowy z wewnątrz R.

Szukam bardziej ogólnych strategii niż konkretnego kodu (chociaż kod też byłby świetny!). Czy Sweave będzie najwygodniejszym rozwiązaniem? W zasadzie mogę użyć socketConnection() do wydruku na drukarce - a jeśli tak, to gdzie mogę dowiedzieć się, jak z niej korzystać (dokumentacja nie była zbyt pomocna).

Author: Frank, 2012-05-14

10 answers

Oto szybka i łatwa możliwość użycia grid.table z pakietu gridExtra:

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

Tutaj wpisz opis obrazka

Jeśli Twoje dane nie mieszczą się na stronie, możesz zmniejszyć rozmiar tekstu grid.table(mtcars, gp=gpar(fontsize=8)). Może to nie być bardzo elastyczne, ani łatwe do uogólnienia lub zautomatyzowania.

 97
Author: bdemarest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-14 17:31:50

Sugerowałbym xtable w połączeniu z dokumentami LaTeX. Zobacz przykłady w tym pdf:

Można też bezpośrednio połączyć to z Sweave lub knitr.

 16
Author: smu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 15:45:39

The printr Pakiet jest dobrym rozwiązaniem do drukowania data.frames, stron pomocy, list winiet i list zbiorów danych w dokumentach knitr .

Ze strony dokumentacji :

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.")
 6
Author: jsta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-04 14:36:51

Siatka.rozwiązanie tabeli będzie rzeczywiście najszybszym sposobem tworzenia plików PDF, ale może to nie być optymalne rozwiązanie, jeśli masz dość długi stół. RStudio + knitr + longtable ułatwia tworzenie ładnie sformatowanych plików PDF. To czego potrzebujesz to coś w stylu:

\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 Zobacz Ten Po Więcej Szczegółów.

 6
Author: Thusi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-02 19:47:06

Dziwi mnie, że nikt nie wspomniał o stargazer pakiecie do ładnego drukowania danych.

Możesz wypisać ładny plik tekstowy:

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

Lub nawet 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>
 5
Author: BLT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 17:26:36

Nie tak fantazyjne, ale bardzo utylitarne:

print.data.frame(iris)
 4
Author: jclouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 18:09:53

RStudio IDE daje kolejną ładną opcję wydruku danych.Tabela:

  1. Otwórz dane w przeglądarce, np. View(data_table) lub poprzez GUI
  2. Otwórz widok w oddzielnym oknie (ikona w lewym górnym rogu: "Pokaż w nowym oknie")
  3. oddzielne okno obsługuje teraz okno drukowania (w tym. podgląd)

To działa w RStudio V0.98. 1103 (i prawdopodobnie nowsze wersje)

 2
Author: kirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-12 14:37:56

Do długich/szerokich tabel możesz użyć pander .

Automatycznie podzieli długie tabele na krótsze części pasujące do strony, np. za pomocą knitr Wstaw ten fragment do pliku Rmd:

pander::pander(mtcars)

Tutaj wpisz opis obrazka

Jeśli chcesz coś, co wygląda bardziej jak tabele Excela (nawet z opcjami edycji w html), użyj rhandsontable . Więcej informacji o użyciu i formatowaniu w winiecie . Będziesz musiał zrobić na drutach Twoje Rmd do pliku html:

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

Tutaj wpisz opis obrazka

 2
Author: epo3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-03 16:34:12

Natknąłem się na to pytanie, gdy chciałem zrobić coś podobnego. Znalazłem wzmiankę o poleceniu sink gdzie indziej {[3] } na stackoverflow, która była przydatna w tym kontekście:

sink('myfile.txt')
print(mytable,right=F)
sink()
 1
Author: JamesF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:24

Jeśli chcesz eksportować jako png, możesz zrobić tak:

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

Jeśli chcesz wyeksportować plik pdf, możesz to zrobić w następujący sposób:

library(gridExtra)
pdf("test.pdf", height=11, width=10)
grid.table(df)
dev.off()
 0
Author: Ning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-27 14:04:55