如何在 LaTeX 中使用 R 生成的表格?

如何在 LaTeX 中使用 R 生成的表格?

我有一个像这样生成的 LaTeX 表格,

\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrrrr}
\hline
& 1 & 2 & 3 & 4 & 5 & 6 \\ 
\hline
1 & 181.21 & 169.01 & 130.03 & 135.93 & 142.31 & 108.11 \\ 
2 & 106.80 & 130.71 & 186.43 & 126.46 & 167.28 & 137.91 \\ 
3 & 162.69 & 198.98 & 188.33 & 184.30 & 147.02 & 197.38 \\ 
4 & 132.42 & 150.50 & 148.69 & 134.31 & 129.52 & 172.72 \\ 
\hline
\end{tabular}
\end{center}
\end{table}

但是当我在 MiKTeX 中编译它时出现以下错误

! Undefined control sequence.
l.1 \begin
          {table}[ht]
? 
Process interrupted by user

我想要一个根据我在 pdfTeX 下编译的表格。我第一次使用 LaTeX,有人能给我一些建议吗?

答案1

由于您是从 R 生成表格,因此我假设您使用 R 的xtable包来生成表格。这个包有一些不足之处,但仍然相当有用。

这是一个示例 R 会话,展示了如何使用该包。

R-会话

data(tli)
## Demonstrate aov
 ## Taken from help(aov) in R 1.1.1
 ## From Venables and Ripley (1997) p.210.
 N <- c(0,1,0,1,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,0)
 P <- c(1,1,0,0,0,1,0,1,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0)
 K <- c(1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,1,0)
 yield <- c(49.5,62.8,46.8,57.0,59.8,58.5,55.5,56.0,62.8,55.8,69.5,55.0,
+            62.0,48.8,45.5,44.2,52.0,51.5,49.8,48.8,57.2,59.0,53.2,56.0)
 npk <- data.frame(block=gl(6,4), N=factor(N), P=factor(P), K=factor(K), yield=yield)
 npk.aov <- aov(yield ~ block + N*P*K, npk)
 op <- options(contrasts=c("contr.helmert", "contr.treatment"))
 npk.aovE <- aov(yield ~  N*P*K + Error(block), npk)
 options(op)

使用 xtable 生成表格

## Standard xtable use
print(xtable(summary(npk.aov)))

% latex table generated in R 2.12.2 by xtable 1.5-6 package
% Fri Aug 12 16:00:48 2011
\begin{table}[ht]
\begin{center}
\begin{tabular}{lrrrrr}
  \hline
 & Df & Sum Sq & Mean Sq & F value & Pr($>$F) \\ 
  \hline
block       & 5 & 343.29 & 68.66 & 4.45 & 0.0159 \\ 
  N           & 1 & 189.28 & 189.28 & 12.26 & 0.0044 \\ 
  P           & 1 & 8.40 & 8.40 & 0.54 & 0.4749 \\ 
  K           & 1 & 95.20 & 95.20 & 6.17 & 0.0288 \\ 
  N:P         & 1 & 21.28 & 21.28 & 1.38 & 0.2632 \\ 
  N:K         & 1 & 33.13 & 33.13 & 2.15 & 0.1686 \\ 
  P:K         & 1 & 0.48 & 0.48 & 0.03 & 0.8628 \\ 
  Residuals   & 12 & 185.29 & 15.44 &  &  \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

该命令的输出是分段LaTeX 代码,而不是完整的工作文档。它旨在被剪切并粘贴到现有的 LaTeX 文档中。这就是您收到错误的原因。至少,文档应如下所示:

\documentclass{article}
\begin{document}
...
\end{document}

然后您将表格代码插入到该...位置。然后使用 进行编译pdflatex

这将生成下表:

代码输出

标准 xtable 输出的问题

标准输出存在许多问题xtable

  1. 它会产生一个浮动的{table}环境
  2. 它封闭tabular在一个{center}环境中
  3. 它使用标准\hline作为分隔符

虽然浮动表格环境在将表格包含到较大的 LaTeX 文档中时很有用,但如果您只生成单个表格,则没有必要。此外,浮动环境会将xtable表格封闭在一个{center}环境中,从而在表格和文档的其他元素之间留下过多的额外空间。最后,它会使用\hline表格规则,导致表格看起来很拥挤。

尽管会损失一些自动生成功能,但大多数问题都是可以解决的。

前两个问题是相互关联的。该print.xtable函数有两个参数,一个参数表示表格是否应该浮动,另一个参数定义包裹表格的环境。因此,我们可以修改初始命令以按以下方式打印表格,以抑制这两个问题:

## Revised R print command
print(xtable(summary(npk.aov)),floating=FALSE,latex.environments=NULL)

这将生成以下 LaTeX 代码:

% latex table generated in R 2.12.2 by xtable 1.5-6 package
% Fri Aug 12 16:29:29 2011
\begin{tabular}{lrrrrr}
  \hline
 & Df & Sum Sq & Mean Sq & F value & Pr($>$F) \\ 
  \hline
block       & 5 & 343.29 & 68.66 & 4.45 & 0.0159 \\ 
  N           & 1 & 189.28 & 189.28 & 12.26 & 0.0044 \\ 
  P           & 1 & 8.40 & 8.40 & 0.54 & 0.4749 \\ 
  K           & 1 & 95.20 & 95.20 & 6.17 & 0.0288 \\ 
  N:P         & 1 & 21.28 & 21.28 & 1.38 & 0.2632 \\ 
  N:K         & 1 & 33.13 & 33.13 & 2.15 & 0.1686 \\ 
  P:K         & 1 & 0.48 & 0.48 & 0.03 & 0.8628 \\ 
  Residuals   & 12 & 185.29 & 15.44 &  &  \\ 
   \hline
\end{tabular}

如果需要让表浮动,那么您应该floating=FALSE从命令中删除参数,但保留latex.environments=NULL

然而,这仍然使我们的桌子显得拥挤不堪。

使用booktabs制作表格

高质量表格的黄金标准是booktabs包装,并xtable提供布尔值来精确地执行此操作。

最终的 R 打印命令

print(xtable(summary(npk.aov)),floating=FALSE,latex.environments=NULL,booktabs=TRUE)

这将生成以下更加漂亮的表格:(您需要将其添加\usepackage{booktabs}到 LaTeX 文档的序言中。)

在此处输入图片描述

如果您希望表格浮动(因为您将它包含在较大的 LaTeX 文档中,那么您应该消除该参数,然后floating=FALSE添加latex.environments=NULL)。在您的 LaTeX 源中,您需要手动添加以使表格居中。\centering\begin{table}

答案2

这是使用latex函数的另一种方法Hmisc。一方面,它只处理矩阵和数据框;另一方面,它本身知道booktabs,可以直接或通过其子程序 进行调整format.df,并且随标准安装一起提供。使用npk.aov与 Alan Munn 相同的示例,我可以使用以下代码生成大致相同的表格

> latex(summary(npk.aov)[[1]], cdec=c(0,2,2,2,4), na.blank=TRUE,
        booktabs=TRUE, table.env=FALSE, center="none", file="", title="")

输出

% latex.default(summary(npk.aov)[[1]], cdec = c(0, 2, 2, 2, 4),      na.blank = TRUE, booktabs = TRUE, table.env = FALSE, center = "none",      file = "", title = "") 
%
\begin{tabular}{lrrrrr}
\toprule
\multicolumn{1}{l}{}&\multicolumn{1}{c}{Df}&\multicolumn{1}{c}{Sum Sq}&\multicolumn{1}{c}{Mean Sq}&\multicolumn{1}{c}{F value}&\multicolumn{1}{c}{Pr(\textgreater F)}\tabularnewline
\midrule
block      &$ 5$&$343.29$&$ 68.66$&$ 4.45$&$0.0159$\tabularnewline
N          &$ 1$&$189.28$&$189.28$&$12.26$&$0.0044$\tabularnewline
P          &$ 1$&$  8.40$&$  8.40$&$ 0.54$&$0.4749$\tabularnewline
K          &$ 1$&$ 95.20$&$ 95.20$&$ 6.17$&$0.0288$\tabularnewline
N:P        &$ 1$&$ 21.28$&$ 21.28$&$ 1.38$&$0.2632$\tabularnewline
N:K        &$ 1$&$ 33.13$&$ 33.13$&$ 2.15$&$0.1686$\tabularnewline
P:K        &$ 1$&$  0.48$&$  0.48$&$ 0.03$&$0.8628$\tabularnewline
Residuals  &$12$&$185.29$&$ 15.44$&$$&$$\tabularnewline
\bottomrule
\end{tabular}

其结果与艾伦得到的结果几乎相同:

格式化表格

一个可能重大的变化是它将所有的数字都包装在数学模式中,这可能是也可能不是你想要的。

答案3

关于如何在 LaTeX 中使用 R 输出的一个老问题,没有人提及旧的Sweave和新的knitr

解决方案:您不需要直接处理 R 生成的 LaTeX 块,只需编写完整的 LaTeX 文档。如前所述,这意味着从...开始

\documentclass{someclass}
 % maybe the next R and LaTeX  code will need some preamble here  
\begin{document} 
Some text ... 

并以……结束本文。

\end{document}

现在使用 (R noweb) 扩展保存它.Rnw,并在其中写入 R 代码以生成用 或<<>>=<<name, options>>= 分隔的两行之间的表格@。如果您使用 R 函数Sweave或较新的Knitr包将文件转换.Rnw为真实.tex文件(带有/不带有 R 输出和/或带有/不带有 R 代码,则可能的选项会有所不同,具体取决于选项。最后,文件由或您选择的 TeX 引擎.tex处理 以生成文件)。pdflatex.pdf

Compile PDF进行两种文件转换的简单方法是在编辑文件时使用 Rstudio 按钮编辑文件.Rnw

注意:避免混合使用 Knirt 和 Sweave 选项(有些很常见,但有些不兼容)。由于 Knitr 较新且功能更强大,目前我的建议是忘记 Sweave,只关注 Knitr。

注意:不仅xtable包可以制作 LaTex 表格:至少您也可以使用 knitr其本身,它具有kable功能(kableExtra看起来也像是一个不错的表格)以及包 stargazerHmisc

example.Rnw在这个小文件中使用knitr(*)进行一点比较 。

(*) 您无法使用 编译此示例,Sweave因为一些 R 块选项以及kable函数是 所特有的knitr。使用 Rstudio,您可以在 > > > Weave Rnw files using:中从使用 切换Sweave到(将其更改为)。knitrToolsGlobal OptionsSweaveSweaveknitr

姆韦

\documentclass{article}
\usepackage[margin=1em,paperheight=8cm,paperwidth=12cm]{geometry}  
\usepackage{booktabs,lipsum}
\begin{document}
<<echo=F,message=F,warning=F,comment="">>=
library(xtable)
library(stargazer)
library(kableExtra) 
library(Hmisc) 
data("mtcars")  # some example data 
df <-mtcars[1:3, 1:6]
@

<<echo=F,results="asis">>=
print(xtable(df,caption="Example with \\texttt{xtable}"), 
booktabs=T, caption.placement="top")
stargazer(df, summary=F, 
title="Example with \\texttt{stargazer}")
kable(df, booktabs = T, 
caption = "Example with  \\texttt{kable}  and \\texttt{kableExtra}")
latex(df, file = '', caption="Example with  \\texttt{Hmisc}")
@
\end{document}

编辑(2024):

如今,另一种可能性是 Quarto。其理念相同(文本中的 R 块与 集成Knitr),但文本源是简单的 markdown(但可能包含 LaTeX 代码),块语法不同:在这种情况下,转换过程是带有 R 块的 markdown(.qmd)→仅 markdown(.md)→仅 LaTeX(.tex)→PDF。示例:

---
format: pdf
---

This will be also a \LaTeX{} document.

```{r}
#| echo: false
#| results: asis

data("mtcars") 
knitr::kable(mtcars[1:3, 1:6])

```

注意:Quarto 基于较旧的 Rmarkdown,因此非常相似,但也存在一些差异。还要注意避免混淆 Rmarkdown 和 Quarto 语法。您可以使用 Rstudio 或 VScode 以及适当的插件或任何文本编辑器和控制台命令来编辑和编译 Qurto 文档。 姆韦

相关内容