2013-05-12 16 views
19

Utilizzando Rstudio e knitr per produrre tabelle in lattice in formato PDF, come faccio ad adattarlo alla pagina? Sto praticamente cercando il modo di ridurre i tavoli.Regola automaticamente la larghezza della tabella LaTeX per adattarla al formato PDF utilizzando knitr e Rstudio

Con le cifre, in Knitr è molto semplice usare out.width =, ma con le tabelle non riesco a trovare un modo per farlo.

Qualche suggerimento?

\documentclass{article} 

\begin{document} 

Le seguenti tabelle sono troppo larga per adattarsi allo pdf. Spero che ci sia un modo semplice per ridurli per adattarsi. In questo esempio ho usato le tabelle generate dalle funzioni xtable(), stargazer() e latex().

<<message=FALSE>>= 
library(xtable) 
library(stargazer) 
library(Hmisc) 
library(tables) 
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,]) 

@ 



<<results='asis'>>= 
xtable(wide.df) 
@ 


<<results='asis'>>= 
stargazer(wide.df,summary=FALSE) 
@ 


<<results='asis'>>= 
latex(tabular(Species ~ (Sepal.Length +Sepal.Length + Sepal.Width + Petal.Length + Petal.Width )*(mean + sd + mean + mean)   , data=iris)   ) 

@ 




\end{document} 

Seguendo i suggerimenti di Stat-R Ho cercato di usare resizebox, ma non può farlo funzionare:

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

Ho cercato di utilizzare reshapebox ma sono davvero all'oscuro su come farlo funzionare in Rstudio/knitr:

<<message=FALSE>>= 
library(xtable) 
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,]) 
@ 

\resizebox{0.75\textwidth}{!}{% 
<<results='asis'>>= 
xtable(wide.df) 
@ 
%} 

\end{document} 

ottengo questo errore:

! File ended while scanning use of \[email protected]@dd. 


sessioninfo() 

R version 3.0.0 (2013-04-03) 
Platform: i386-w64-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252 LC_MONETARY=Danish_Denmark.1252 LC_NUMERIC=C     
[5] LC_TIME=Danish_Denmark.1252  

attached base packages: 
[1] splines grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] tables_0.7  Hmisc_3.10-1 survival_2.37-4 stargazer_3.0.1 pgirmess_1.5.7 splancs_2.01-32 spdep_0.5-56 coda_0.16-1  deldir_0.0-22 
[10] maptools_0.8-23 foreign_0.8-53 MASS_7.3-26  Matrix_1.0-12 lattice_0.20-15 rgdal_0.8-9  sp_1.0-9  nlme_3.1-109 boot_1.3-9  
[19] xtable_1.7-1 scales_0.2.3 plyr_1.8  reshape2_1.2.2 ggplot2_0.9.3.1 

loaded via a namespace (and not attached): 
[1] cluster_1.14.4  colorspace_1.2-2 dichromat_2.0-0 digest_0.6.3  evaluate_0.4.3  formatR_0.7  gtable_0.1.2  knitr_1.2   
[9] labeling_0.1  LearnBayes_2.12 munsell_0.4  proto_0.3-10  RColorBrewer_1.0-5 stringr_0.6.2  tools_3.0.0 
+1

Avete considerato: http: //tex.stackexchange.com/questions/26477/wider-tables-in- latex-which-is-the-best-solution] –

+0

Per me sembra più una domanda in lattice che rstudio e knitr –

+0

Probabilmente si adatterà anche a tex.stack (...) e il collegamento fine che mi hai indicato mi ha indirizzato resizebox() tuttavia non riesco a farlo funzionare in un documento knitr in Rstudio:/ –

risposta

0

Che ne dici di suddividere automaticamente i tavoli larghi in parti proprio come nei buoni vecchi terminali VT100 a 80 caratteri? Questo è di solito una buona pratica per le tabelle/DOCX/ODT lattice e impostata di default in pander:

> set.caption('Hello Fisher!') 
> pander(wide.df) 

--------------------------------------------------------- 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
-------------- ------------- -------------- ------------- 
    5.1   3.5   1.4   0.2  

    4.9    3   1.4   0.2  

    4.7   3.2   1.3   0.2  

    4.6   3.1   1.5   0.2  

     5    3.6   1.4   0.2  

    5.4   3.9   1.7   0.4  

    4.6   3.4   1.4   0.3  

     5    3.4   1.5   0.2  

    4.4   2.9   1.4   0.2  

    4.9   3.1   1.5   0.1  
--------------------------------------------------------- 

Table: Hello Fisher! (continued below) 


----------------------------------------------------- 
Species Sepal.Length Sepal.Width Petal.Length 
--------- -------------- ------------- -------------- 
setosa  5.1   3.5   1.4  

setosa  4.9    3   1.4  

setosa  4.7   3.2   1.3  

setosa  4.6   3.1   1.5  

setosa   5    3.6   1.4  

setosa  5.4   3.9   1.7  

setosa  4.6   3.4   1.4  

setosa   5    3.4   1.5  

setosa  4.4   2.9   1.4  

setosa  4.9   3.1   1.5  
----------------------------------------------------- 

Table: Table continues below 


---------------------------------------------------- 
Petal.Width Species Sepal.Length Sepal.Width 
------------- --------- -------------- ------------- 
    0.2  setosa  5.1   3.5  

    0.2  setosa  4.9    3  

    0.2  setosa  4.7   3.2  

    0.2  setosa  4.6   3.1  

    0.2  setosa   5    3.6  

    0.4  setosa  5.4   3.9  

    0.3  setosa  4.6   3.4  

    0.2  setosa   5    3.4  

    0.2  setosa  4.4   2.9  

    0.1  setosa  4.9   3.1  
---------------------------------------------------- 

Table: Table continues below 


-------------------------------------- 
Petal.Length Petal.Width Species 
-------------- ------------- --------- 
    1.4   0.2  setosa 

    1.4   0.2  setosa 

    1.3   0.2  setosa 

    1.5   0.2  setosa 

    1.4   0.2  setosa 

    1.7   0.4  setosa 

    1.4   0.3  setosa 

    1.5   0.2  setosa 

    1.4   0.2  setosa 

    1.5   0.1  setosa 
-------------------------------------- 

Si prega di vedere ?pandoc.table e table.split.table in ?panderOptions per maggiori dettagli.

0

Il pacchetto LaTeX tabulary è migliore per adattare una tabella alla larghezza della pagina. Ad esempio, si può dire di spezzare le linee. Ma non so se puoi usarlo con xtable.

11

È possibile passare un argomento scalebox-print.xtable in questo modo

<<results='asis'>>= 
print(xtable(wide.df), scalebox='0.75') 
@ 

Ciò non ridimensiona automaticamente la tabella per adattare la pagina (purtroppo xtable non supporta un argomento resizebox), ma per molte applicazioni il cui sopra potrebbe essere abbastanza buono

Il problema con il codice è che xtable restituisce la tabella racchiusa in un ambiente table e non solo un tabulare. Quello che si deve racchiudere nello resizebox, tuttavia, è lo tabular. L'unico modo che posso vedere per arrivare a questo lavoro come lo vuoi è quello di far ritorno XTABLE solo il tabular, in questo modo:

\begin{table} 
\resizebox{\textwidth}{!} { 
<<results='asis'>>= 
print(xtable(wide.df), floating=FALSE) 
@ 
} 
\end{table} 

e poi scrivere il codice LaTeX intorno ad esso manualmente.

+0

Grazie per l'ottima soluzione. Mi chiedo solo se c'è un modo per usare '\ textwidth' solo quando la larghezza della tabella è maggiore di' \ textwidth'? Nella segnalazione automatica a volte i tavoli sono grandi e talvolta piccoli. Usando la larghezza del testo intero generato enorme tabella dei caratteri enorme. – Shambho

+0

Forse questo potrebbe funzionare: http://tex.stackexchange.com/questions/97505/shrink-table-to-fit-on-a-page-or-keep-it-as-it-is – RoyalTS

2

Di seguito sono riportati alcuni passaggi tipici che è possibile eseguire per ridurre le dimensioni della tabella.

\setlength{\tabcolsep}{1pt} 

\resizebox{\linewidth}{!}{ %% <-- The most effective way to fit a table/figure 
\begin{tabular} 
... 
... 
\end{tabular} 
} %resizebox 

Per utilizzare la modalità Testo \sf per rendere il testo più visibile.

0

Un'altra opzione potrebbe essere qualcosa di simile:

my_wrap <- function(x, width) { 
    x_split <- strwrap(x, width = width, simplify = FALSE) 
    x_split <- lapply(x_split, paste, collapse = " \\\\ ") 
    vapply(x_split, function(s) sprintf("\\begin{tabular}[x]{@{}[email protected]{}}%s\\end{tabular}", s), 
     character(1)) 
} 

applicato a tutte le colonne che sono a largo

0

Il seguente funziona bene per me:

print(xtable(wide.df), scalebox='0.75', floating=FALSE) 

Ciò è particolarmente utile per le tabelle in R Markdown.

+0

Non funziona per me. Io uso la funzione kable e r {results = 'asis "} – JAQuent

6

Aggiornamento per riflettere le modifiche nel codice degli ultimi anni e la preferenza per le persone di lavorare normalmente in .RMarkdown anziché in formato di file Rnw.

Il pacchetto kableExtra in R è il modo più semplice per regolare le dimensioni delle tabelle. È possibile ridimensionare la larghezza della tabella utilizzando la funzione kable_styling(latex_options = "scale_down"). Questo costringerà la tabella alla larghezza della pagina.

kable(iris[1:5,], 
      format = "latex", booktabs = TRUE) %>% 
      kable_styling(latex_options = "scale_down") 

For more examples of the kableExtra package, check out the package here: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Ecco un esempio MWE:

--- 
title: "MWE" 
author: "Mikey Harper" 
date: "7 November 2017" 
output: pdf_document 
--- 

```{r setup, include=FALSE} 
library(kableExtra) 
library(magrittr) 
knitr::opts_chunk$set(echo = TRUE) 
``` 

```{r} 
# Build the dataframe 
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,]) 
``` 

```{r} 
# Basic table 
knitr::kable(wide.df) 
``` 

```{r} 
# Scaled Table 
knitr::kable(wide.df, format = "latex", booktabs = TRUE) %>% 
      kable_styling(latex_options = "scale_down") 
``` 

enter image description here

+0

Se qualcun altro ha problemi a posizionare la tabella quando si usa questo metodo ci sono ulteriori' latex_options' da 'kableExtra',' "hold_postion" 'e' "HOLD_position" ' a disposizione. – mlegge

0

Una huxtable soluzione basata su (il mio pacchetto):

library(huxtable) 
h <- as_hux(iris) 
width(h) <- 0.5 

questo non garantisce il ta ble non supererà la larghezza specificata, e se quindi verrà sovraccaricato. Possibili soluzioni includono cambiare la dimensione del carattere:

font_size(h) <- 8 

o il frazionamento della tabella:

h1 <- h[, 1:5] 
h2 <- h[, -(1:5)]