【问题标题】:Xtable two columns using longtable customizationsXtable 使用 longtable 自定义的两列
【发布时间】:2015-09-23 17:06:09
【问题描述】:

这是我之前发布的question 的延续。我在 RStudio 中有一个 code.Rnw 文件,我使用 knit("code.Rnw") 命令将它编织成一个 code.tex 文件。

我有一个使用 xtable 命令打印的数据框。在下面的示例中,它是 20 行。但是,为了节省空间,我将其打印为两列,每列 10 行。

下面是我的代码:

\documentclass[11pt, a4paper]{article}
\usepackage[margin=3cm]{geometry}
\usepackage{longtable}

\begin{document}

<<echo=FALSE,results='asis'>>=
library(xtable)
set.seed(1)

spaceCol =  rep("     ",10)
df1 = data.frame(student = letters[1:10], vals=runif(10, 1, 10))
df2 = data.frame(student = letters[11:20], vals=runif(10, 1, 10))
dfFull = data.frame(df1,spaceCol,df2)
names(dfFull) = c(" ","% Correct","     "," ", "% Correct")
row.names(dfFull) = NULL

x.big <- xtable(dfFull, label ='tabtwo',caption ='Caption for table with student scores')
print(x.big, tabular.environment ='longtable', floating = FALSE, include.rownames=FALSE)
@

\end{document}

这是输出的样子:

我喜欢这个输出的美感,特别是因为在 longtable 格式中,如果需要,这个输出会自动分页。但是,我想要改进的是更容易看到这个输出实际上是两个不同的列。

为此,我想在两列之间添加一个空格,因此输出看起来更像如下:

但是,如果这被证明是不可能的,那么我可以考虑添加一条垂直线来区分两列,如下所示:

鉴于我在使用 xtable 方面的限制,这怎么可能?

【问题讨论】:

  • 您可以做的一件简单的事情是将align = c("rrrr|lr") 添加到您的xtable 呼叫中。我认为实现最初目标的唯一方法是手动使用子图。这应该不会太难,但会涉及一些 LaTeX 的手动编写,而不是让 knitr 和 xtable 为您完成工作。但是,我认为没有其他选择,因为 knitr 能够创建子图,但据我所知,只有图表。

标签: r knitr xtable longtable


【解决方案1】:
\documentclass[11pt, a4paper]{article}

\usepackage{subfig}

\begin{document}

<<echo = FALSE>>=
library(xtable)

opts_chunk$set(
  echo = FALSE,
  results = 'asis'
)

set.seed(1)

mynames <- c("", "% Correct")

df1 = data.frame(letters[1:10], runif(10, 1, 10))
df2 = data.frame(student = letters[11:20], vals=runif(10, 1, 10))

colnames(df1) <- mynames
colnames(df2) <- mynames
@

\begin{table}\centering
\subfloat{
<<>>=
print(xtable(df1), floating = FALSE, include.rownames = FALSE)
@
} \hspace{2cm}
\subfloat{
<<>>=
print(xtable(df2), floating = FALSE, include.rownames = FALSE)
@
}
\caption{Caption for table with student scores} \label{tabtwo}
\end{table}
\end{document}

唯一的缺点是,您不能在这种方法中使用longtable

更新:这是使用longtable 的替代方法。诀窍是仅将xtable 用于表格的contents 并手动构建标题,因此您可以完全控制所有行等。我决定使用空列作为空间,因为使第2 列更宽会让水平线看起来很难看。

\documentclass{article}

\usepackage{longtable}

\begin{document}
\thispagestyle{empty}

<<echo = FALSE>>=
library(xtable)

opts_chunk$set(
  echo = FALSE,
  results = 'asis'
)

set.seed(1)

df1 = data.frame(letters[1:10], runif(10, 1, 10))
df2 = data.frame(student = letters[11:20], vals=runif(10, 1, 10))

dfFull <- cbind(df1, NA, df2)
@

\begin{longtable}{lrl@{\hskip 2cm}lr} \cline{1-2} \cline{4-5}
 & \% Correct & & & \% Correct \\ \cline{1-2} \cline{4-5}
<<>>=
print(xtable(dfFull), only.contents = TRUE, include.rownames = FALSE, include.colnames = FALSE, hline.after = NULL)
@
\cline{1-2} \cline{4-5}
\caption{Caption for table with studen scores} \label{tabtwo}
\end{longtable}
\end{document}

UPDATE2:最后,使用longtable 的解决方案不涉及“手动”创建表的一半。诀窍是删除所有水平线 (hline.after = NULL),然后在需要的地方使用 add.to.row 添加\clines(受this question 启发)。

\documentclass{article}

\usepackage{longtable}

\begin{document}
\thispagestyle{empty}

<<echo = FALSE, results = 'asis'>>=
library(xtable)

set.seed(1)


df1 = data.frame(letters[1:10], runif(10, 1, 10))
df2 = data.frame(letters[11:20], runif(10, 1, 10))

dfFull <- cbind(df1, NA, df2)

# To test "longtable", rbind data several times:
multiply <- 5
dfFull <- do.call("rbind", replicate(multiply, dfFull, simplify = FALSE))

colnames(dfFull) <- c("", "% Correct", "", "", "% Correct")

print(xtable(dfFull,
             caption = "Caption for table with student scores",
             label = "tabtwo",
             align = c("l",  # ignored (would apply to colnames)
                       "l", "r",
                       "l@{\\hskip 2cm}", # space between blocks
                       "l", "r")),
      include.rownames = FALSE,
      include.colnames = TRUE,
      hline.after = NULL, # Remove all default lines. A line after the very last row remains, which is automatically added when using "longtable".
      tabular.environment = "longtable",
      floating = FALSE,
      add.to.row = list(
        pos = list(-1, 0),
        command = rep("\\cline{1-2} \\cline{4-5}", 2))
      )
@
\end{document}

【讨论】:

  • 谢谢@user2706569,但是这个解决方案没有考虑分页!如果我增加行数,它就会跑出页面。
  • 是的。我看到了两种可能的解决方案。 A:找到不使用子图的解决方案,然后您可以轻松使用longtable(我对您问题的评论可能会有所帮助)。 B:想办法将longtable 包含到子图中。这是一个纯 LaTeX 问题。 (C:手动拆分表)
  • 另外感谢您关于在 xtable 中使用 align 调用的建议。是的,这确实添加了我想要的垂直线。我宁愿有一个垂直空间而不是垂直线,所以我会看看是否有人对此有一点想法。否则,我会守住这条线!
  • 再次感谢。您能否进一步解释第三个选项的含义...手动拆分表格?我只是想确保我理解这意味着什么,以便我可以研究它!
  • 我的意思是类似于print(xtable(df1[1:10,])); print(xtable(df1[11:20,])),如果您知道在前 10 行之后需要分页符。但要小心 - 您的文档可能会发生变化,可用空间也会发生变化。因此,我不认为这是一个好的解决方案。或者:使用一个带有only.contents = TRUE, include.colnames = FALSE, hline.after = NULL 的表并自行构建“标题”。
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2016-07-28
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
相关资源
最近更新 更多