it-swarm.com.de

Passen Sie die LaTeX-Tabellenbreite mithilfe von knitr und Rstudio automatisch an das PDF an

Wie kann ich mit Rstudio und knitr Latex-Tabellen im PDF-Format erstellen? Wie kann ich breite Tabellen an die Seite anpassen? Ich bin grundsätzlich auf der Suche nach Möglichkeiten, die Tische zu verkleinern.

Mit Zahlen ist es in Knitr wirklich einfach, out.width = zu verwenden, aber mit Tabellen kann ich keinen Weg finden, dies zu tun. 

Irgendwelche Vorschläge?

\documentclass{article}

\begin{document}

Die folgenden Tabellen sind zu breit für das PDF. Ich hoffe, es gibt eine einfache Möglichkeit, sie zu verkleinern. In diesem Beispiel habe ich Tabellen verwendet, die aus den Funktionen xtable (), stargazer () und latex () generiert wurden.

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

Den Stat-R-Vorschlägen folgend habe ich versucht, die resizebox zu verwenden, aber es funktioniert nicht:

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

Ich habe versucht, Reshapebox zu verwenden, aber ich weiß wirklich nicht, wie ich es in Rstudio/knitr schaffen kann:

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

Ich erhalte diesen Fehler: 

! 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 
22
Rene Bern

Sie können ein scalebox-Argument wie folgt an print.xtable übergeben

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

Die Größe der Tabelle wird dadurch nicht automatisch an die Seite angepasst (leider unterstützt xtable kein resizebox-Argument), aber für viele Anwendungen ist dies möglicherweise ausreichend.

Das Problem mit Ihrem Code ist, dass xtable die Tabelle in einer table-Umgebung und nicht nur in einer Tabelle zurückgibt. Was Sie in resizebox einschließen müssen, ist jedoch tabular. Der einzige Weg, um zu sehen, dass dies so funktioniert, wie Sie es möchten, besteht darin, dass xtable nur den tabular zurückgeben soll, wie es so ist:

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

und dann den LaTeX-Code manuell umschreiben.

14
RoyalTS

Aktualisierung, um die Änderungen im Code der letzten Jahre widerzuspiegeln und die Einstellung, dass Leute normalerweise in .RMarkdown statt im Rnw-Dateiformat arbeiten.

Das Paket kableExtra in R ist der einfachste Weg, um die Größe von Tabellen anzupassen. Sie können die Breite der Tabelle mit der Funktion kable_styling(latex_options = "scale_down") skalieren. Dadurch wird die Tabelle auf die Breite der Seite festgelegt.

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

Weitere Beispiele für das kableExtra-Paket finden Sie hier: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Hier ist ein Beispiel für 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

9
Michael Harper

Im Folgenden sind einige typische Schritte aufgeführt, mit denen Sie die Tabellengröße verkleinern können.

\setlength{\tabcolsep}{1pt}

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

Verwenden Sie für Text den Modus \sf, um den Text besser sichtbar zu machen.

2
LKB

Das LaTeX-Paket tabulary passt besser eine Tabelle an die Seitenbreite an. Es kann beispielsweise gesagt werden, dass die Zeilen unterbrochen werden. Ich weiß nicht, ob Sie es mit xtable verwenden können.

0
nnn

Eine huxtable-basierte Lösung (mein Paket):

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

Dies garantiert nicht, dass die Tabelle die angegebene Breite nicht überschreitet, und wennso wird sie überschritten. Mögliche Lösungen umfassen das Ändern der Schriftgröße:

font_size(h) <- 8

Oder die Tabelle aufteilen:

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

Folgendes funktioniert gut für mich:

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

Dies ist besonders nützlich für Tabellen in R Markdown.

0
John Maindonald

Eine andere Option könnte so aussehen:

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

wird auf alle Spalten angewendet, die zu breit sind

0
Rentrop

Wie wäre es mit dem automatischen Aufteilen der breiten Tische in Teile wie bei den guten alten 80 Zeichen breiten VT100-Terminals? Dies ist in der Regel eine gute Vorgehensweise für LaTex/docx/odt-Tabellen und wird standardmäßig in pander festgelegt:

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

Weitere Informationen finden Sie unter ?pandoc.table und table.split.table in ?panderOptions.

0
daroczig