Regola automaticamente la larghezza della tabella LaTeX per adattarla al formato PDF utilizzando knitr e Rstudio

Usando Rstudio e knitr per produrre tabelle di latex in pdf, come faccio adattare i tavoli larghi alla pagina? Sto praticamente cercando il modo di ridurre i tavoli.

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

Eventuali suggerimenti?

\documentclass{article} \begin{document} 

Le seguenti tabelle sono troppo ampie per adattarsi al 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 ().

 <>= library(xtable) library(stargazer) library(Hmisc) library(tables) wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,]) @ <>= xtable(wide.df) @ <>= stargazer(wide.df,summary=FALSE) @ <>= 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 provato a utilizzare resizebox ma non riesco a farlo funzionare:

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

Ho provato a usare reshapebox, ma sono davvero all’oscuro su come farlo funzionare in Rstudio / knitr:

 <>= library(xtable) wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,]) @ \resizebox{0.75\textwidth}{!}{% <>= 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 latex_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 

È ansible passare un argomento di print.xtable a print.xtable modo

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

Ciò non ridimensiona automaticamente la tabella per adattarla alla pagina (sfortunatamente xtable non supporta un argomento resizebox ), ma per molte applicazioni il precedente potrebbe essere abbastanza buono.

Il problema con il tuo codice è che xtable restituisce la tabella racchiusa in un ambiente table e non solo un tabulare. Ciò che si deve avvolgere nella resizebox , tuttavia, è il tabular . L’unico modo che posso vedere per far funzionare tutto ciò che vuoi è lasciare che xtable restituisca solo il tabular , in questo modo:

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

e poi scrivere il codice LaTeX attorno ad esso manualmente.

Aggiornamento per riflettere le modifiche apportate al codice negli 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 la dimensione dei tavoli. Puoi ridimensionare la larghezza della tabella usando 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") 

Per ulteriori esempi del pacchetto kableExtra, controlla il pacchetto qui: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Ecco un esempio di 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") ``` 

inserisci la descrizione dell'immagine qui

Di seguito sono riportati alcuni passaggi tipici che è ansible 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 il testo usa la modalità \sf per rendere il testo più visibile.

Che ne direste di suddividere automaticamente le larghe tabelle in parti proprio come nei buoni vecchi terminali VT100 a 80 caratteri? Di solito è una buona pratica per le tabelle LaTex / docx / odt e impostata per 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 -------------------------------------- 

Per favore vedi ?pandoc.table e table.split.table in ?panderOptions per maggiori dettagli.

Il tabulary pacchetto LaTeX è 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.

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 larghe

Il seguente funziona bene per me:

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

Questo è particolarmente utile per le tabelle in R Markdown.

Una soluzione basata su huxtable (il mio pacchetto):

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

Questo non garantisce che la tabella non superi la larghezza specificata, e in tal caso supererà il limite. Le possibili soluzioni includono la modifica della dimensione del carattere:

 font_size(h) <- 8 

O dividendo il tavolo:

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