Подтвердить что ты не робот

Автоматическая настройка ширины таблицы LaTeX для установки в pdf с использованием knitr и Rstudio

Используя Rstudio и knitr для производства латекс-таблиц в формате pdf, как мне сделать широкие таблицы подходящими для страницы? Я в основном ищут способ сжать таблицы.

С рисунками в Knitr это действительно легко, используя out.width =, но с таблицами я не могу найти способ сделать это.

Любые предложения?

\documentclass{article}

\begin{document}

Следующие таблицы слишком широки, чтобы соответствовать PDF. Я надеюсь, что есть простой способ уменьшить их размер. В этом примере я использовал таблицы, созданные из функций xtable(), stargazer() и 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}

Следуя рекомендациям Stat-R, я попытался использовать resizebox, но не могу заставить его работать:

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

Я пытался использовать reshapebox, но я действительно не знаю, как заставить его работать в 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}

Я получаю эту ошибку:

! 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 
4b9b3361

Ответ 1

Вы можете передать аргумент scalebox в print.xtable так:

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

Это не автоматически изменяет размер таблицы для соответствия странице (к сожалению, xtable не поддерживает аргумент resizebox), но для многих приложений вышеуказанное может быть достаточно хорошим.

Проблема с вашим кодом заключается в том, что xtable возвращает таблицу, заключенную в среду table, а не только таблицу. Однако вы должны обернуть resizebox tabular. Единственный способ, с помощью которого я могу заставить это работать, так как вы хотите, чтобы xtable возвращал только tabular, например:

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

а затем написать код LaTeX вокруг него вручную.

Ответ 2

Ниже приведены некоторые типичные шаги, которые можно предпринять для сокращения размера таблицы.

\setlength{\tabcolsep}{1pt}

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

Для использования текста используйте \sf, чтобы сделать текст более заметным.

Ответ 3

Обновление, чтобы отразить изменения в коде за последние несколько лет, и предпочтение для людей, как правило, работать в .RMarkdown вместо формата файла Rnw.

Пакет kableExtra в R - это самый простой способ настройки размера таблиц. Вы можете масштабировать ширину таблицы, используя функцию kable_styling(latex_options = "scale_down"). Это заставит таблицу ширину страницы.

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

Дополнительные примеры пакета kableExtra см. здесь: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Вот пример 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")
```

введите описание изображения здесь

Ответ 4

Как насчет автоматического разделения широких таблиц на части, как на старых старых терминалах VT100 на 80 символов? Как правило, это хорошая практика для таблиц LaTex/docx/odt и устанавливается по умолчанию в 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  
--------------------------------------

Подробнее см. ?pandoc.table и table.split.table в ?panderOptions.

Ответ 5

Пакет LaTeX tabulary лучше подходит для установки таблицы на ширину страницы. Например, можно сказать, что нужно разбить строки. Но я не знаю, можете ли вы использовать его с помощью xxtable.

Ответ 6

Другим вариантом может быть что-то вроде:

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

применяется ко всем столбцам шириной

Ответ 7

Следующие работы отлично подходят для меня:

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

Это особенно полезно для таблиц в R Markdown.