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

80

Chciałbym wydrukować ładnie sformatowane ramki danych na papierze, najlepiej z poziomu skryptu. (Próbuję zbierać dane za pomocą instrumentu i automatycznie przetwarzać je i drukować za pomocą skryptu R).

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

  1. Wynikowy plik tekstowy jest źle sformatowany (kolumny niekoniecznie są zgodne z ich nagłówkami) i
  2. Nie wiem, jak wydrukować plik tekstowy z poziomu R.

Szukam bardziej ogólnych strategii niż konkretnego kodu (chociaż kod też byłby świetny!). Czy Sweave byłby najwygodniejszym rozwiązaniem? W zasadzie mogę używać socketConnection()do drukowania na drukarce - a jeśli tak, to gdzie mogę się dowiedzieć, jak z niego korzystać (nie znalazłem dokumentacji jako bardzo pomocnej).

Drew Steen
źródło
Czy mówimy o MS Word, jak zakładam, czy jest to papier LaTeX?
Tyler Rinker
Czy masz zainstalowany LaTeX na swoim komputerze? Myślę, że pomocna może być kombinacja xtable, sweave (lub knitr) i prawdopodobnie to: livesocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/… . Ale to wydaje się trochę skomplikowane. Interesuje mnie, co wymyślą na to inni.
Dason
Właściwie nie chcę umieszczać ramki danych w większym dokumencie - chcę tylko wydrukować kartkę papieru z czytelną ramką danych, którą następnie umieszczę w moim notatniku laboratoryjnym jako wydruk wyjście instrumentu.
Drew Steen
Nie mam zainstalowanego LaTeX na komputerze, ale myślę, że mogę to zrobić dość łatwo.
Drew Steen
1
% System(lpr [filename]), przynajmniej w świecie * nix, może pozwolić ci odpalić drukarkę z R.
Carl Witthoft

Odpowiedzi:

107

Oto szybka i łatwa możliwość korzystania grid.tablez pakietu gridExtra:

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

wprowadź opis obrazu tutaj

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ć zbyt elastyczne ani łatwe do uogólnienia lub zautomatyzowania.

bdemarest
źródło
@bdemarest, jak umieścić tytuł tego wykresu w formacie PDF?
user1471980
@ user1471980, Jednym ze sposobów jest to grid.arrange(tableGrob(mtcars, gp=gpar(fontsize=6)), main="Main Title Here.").
bdemarest
Czy istnieje sposób, aby wydrukować ramkę danych zawierającą bardzo dużą liczbę wierszy, które nie mieszczą się tylko na jednej stronie?
Nanami
10
@Nanami, spróbuj czegoś takiego:library(gridExtra); maxrow = 30; npages = ceiling(nrow(iris)/maxrow); pdf("iris_pages.pdf", height=11, width=8.5); for (i in 1:npages) {idx = seq(1+((i-1)*maxrow), i*maxrow); grid.newpage(); grid.table(iris[idx, ])}; dev.off()
bdemarest
1
@Masi, mtcarsjest zawarty w datasetspakiecie w standardowej instalacji R. Jest ładowany domyślnie po uruchomieniu nowej sesji języka R. Spróbuj wpisać ?mtcarsi mtcarspo znaku zachęty R, aby zobaczyć, co mam na myśli.
bdemarest
16

Sugerowałbym xtablew połączeniu z dokumentami LaTeX. Spójrz na przykłady w tym pliku PDF:

Możesz również połączyć to bezpośrednio z Sweavelubknitr .

smu
źródło
5
Proszę, nie link, tylko odpowiedź. Byłoby wspaniale mieć minimalny przykład kodu z odtwarzalnymi danymi i przykładowymi danymi wyjściowymi.
Léo Léopold Hertz 준영
Myślę, że krytykę należy skierować do pytającego. Nie przedstawił żadnego minimalnego powtarzalnego przykładu . Wydaje się, że nie ma tu zastosowania zwykłe uzasadnienie nieakceptowania odpowiedzi zawierających tylko link. To pytanie ma 7 lat, a link do winiety umieszczonej w CRAN wydaje się być dość stabilny.
IRTFM
9

Zaskoczony, nikt nie wspomniał o stargazerpakiecie do ładnego drukowania danych.

Możesz wypisać ładnie wyglądający 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>

BLT
źródło
7

printrPakiet jest dobrym rozwiązaniem do drukowania data.frames, strony pomocy, ofert winieta, a zbiór danych ofert w knitr dokumentów.

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.")
jsta
źródło
1
Zauważyłem, że jest to najlepsza opcja spośród wszystkich odpowiedzi, jeśli szukasz drukowania ramki danych w pliku PDF utworzonym przez knitr.
snd
6

Rozwiązanie grid.table 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 znacznie ułatwia tworzenie ładnie sformatowanych plików PDF. Potrzebujesz czegoś takiego:

\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 post, aby uzyskać więcej informacji.

Dlatego też
źródło
Ta odpowiedź byłaby znacznie lepsza z minimalnym przykładem danych i wyników. Teraz czuję, że to skrótowa odpowiedź.
Léo Léopold Hertz 준영
5

W przypadku długich / szerokich stołów można użyć pandera .

To automatycznie podzieli długie tabele na krótsze części, które pasują do strony, np. Używając knitr wstaw ten fragment do pliku Rmd:

pander::pander(mtcars)

wprowadź opis obrazu tutaj

Jeśli chcesz czegoś, co wygląda bardziej jak tabele Excela (nawet z opcjami edycji w html), użyj rhandsontable . Więcej informacji na temat użycia i formatowania w winiecie . Będziesz musiał połączyć Rmd w plik HTML:

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

wprowadź opis obrazu tutaj

epo3
źródło
4

Nie tak wyszukane, ale bardzo użyteczne:

print.data.frame(iris)
jclouse
źródło
1
To przenosi to na ekran, ale nie pokazuje, jak to zrobić na papierze.
Brian Diggs,
4

RStudio IDE daje Kolejną miłą opcję wydrukować data.table:

  1. Otwórz dane w przeglądarce np View(data_table) Lub przez GUI
  2. Otwórz widok w osobnym oknie (ikona w lewym górnym rogu: „Pokaż w nowym oknie”)
  3. Oddzielne okno obsługuje teraz okno dialogowe drukowania (w tym podgląd)

Działa to w RStudio V0.98.1103 (i prawdopodobnie nowszych wersjach)

kościół
źródło
Wygląda na to, że w RStudio V0.99 zniknęło okno dialogowe drukowania dla oddzielnych okien.
kirk
1
Nadal można go uzyskać, klikając widok prawym przyciskiem myszy i wybierając opcję „Otwórz ramkę” (wersja 0.99.887).
mpe
2

Natknąłem się na to pytanie, kiedy chciałem zrobić coś podobnego. Znalazłem wzmiankę o poleceniu sink w innym miejscu w stackoverflow, które było przydatne w tym kontekście:

sink('myfile.txt')
print(mytable,right=F)
sink()
JamesF
źródło
0

Jeśli chcesz wyeksportować jako png, możesz to zrobić:

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

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

library(gridExtra)
pdf("test.pdf", height=11, width=10)
grid.table(df)
dev.off()
Ning
źródło