使用knitr和Rstudio自动调整LaTeX表格宽度以适合pdf

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用knitr和Rstudio自动调整LaTeX表格宽度以适合pdf相关的知识,希望对你有一定的参考价值。

使用Rstudio和knitr以pdf格式生成乳胶表,如何使宽表适合页面?我基本上都在寻找缩小表格的方法。

使用数字,在Knitr中使用out.width =非常容易,但是使用表格我似乎无法找到方法。

有什么建议?

documentclass{article}

egin{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}
egin{document}

我试过使用reshapebox,但我真的对如何让它在Rstudio / knitr中工作毫无头绪:

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


esizebox{0.75	extwidth}{!}{%
<<results='asis'>>=
xtable(wide.df)
@
%}

end{document}

我收到此错误:

! File ended while scanning use of Gscale@box@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 
答案

您可以像这样将scalebox参数传递给print.xtable

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

这不会自动调整表格以适应页面(不幸的是xtable不支持resizebox参数)但是对于许多应用程序,上面的内容可能已经足够了。

您的代码的问题是xtable返回包裹在table环境中的表,而不仅仅是表格。然而,你必须包装在resizebox中的是tabular。我可以看到让你想要它的唯一方法就是让xtable只返回tabular,就像这样:

egin{table}

esizebox{	extwidth}{!} {
<<results='asis'>>=
print(xtable(wide.df), floating=FALSE)
@
}
end{table}

然后手动编写它周围的LaTeX代码。

另一答案

更新以反映过去几年代码中的更改,以及人们通常使用.RMarkdown而不是Rnw文件格式的偏好。

R中的kableExtra包是调整表大小的最简单方法。您可以使用函数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")
```

enter image description here

另一答案

以下是缩小表大小可以采取的一些典型步骤。

setlength{	abcolsep}{1pt}


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

对于文本,使用sf模式使文本更加可见。

另一答案

如何在宽大的80字符宽VT100终端上自动将宽表拆分成部件呢?对于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

另一答案

LaTeX包tabulary更适合将表格与页面宽度相匹配。例如,它可以被告知断线。但我不知道你是否可以将它与xtable一起使用。

另一答案

另一种选择可能是:

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("egin{tabular}[x]{@{}c@{}}%send{tabular}", s),
         character(1))
}

应用于要扩展的所有列

另一答案

以下工作对我来说很好:

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

这对于R Markdown中的表格尤其有用。

另一答案

一个基于huxtable的解决方案(我的包):

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

这并不能保证表格不会超过指定的宽度,如果是这样,它将会溢出。可能的解决方案包括更改字体大小:

font_size(h) <- 8

或拆分表:

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

以上是关于使用knitr和Rstudio自动调整LaTeX表格宽度以适合pdf的主要内容,如果未能解决你的问题,请参考以下文章

具有从 R 到 Latex 的行和多列列名的简单交叉表

Rstudio怎么生成html文件 Rstudio生成html报告方法介绍

.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示

云端敲代码:Rstudio Cloud和Azure Notebooks

使用 KnitR 以编程方式在 R 中创建 Markdown 表

knitr 中 R 代码块和 LaTeX 的全局变量