R生成表格无法并排显示问题咨询(需支持PDF导出)
问题:为何表格无法并排显示?
我正在制作一份可通过knit导出为PDF的报告,遇到格式问题:尝试让两个表格并排显示,但它们始终自动换行。以下是相关代码:
{r OWNER TABLE, echo = F} owner_probs <- data.frame(In = c(0.56, 0.24), Out = c(0.14, 0.06)) row.names(owner_probs) <- c("In", "Out") owner_dse <- owner_probs * 350000 owner_probs <- owner_probs %>% kable(longtable = T, booktabs = T, align = "c", caption = "Probability Table") %>% kable_styling(bootstrap_options = "bordered", position = "float_left") %>% column_spec (1:3, border_left = T, border_right = T) owner_dse <- owner_dse %>% kable(longtable = T, booktabs = T, align = "c", caption = "DSE Table") %>% kable_styling(bootstrap_options = "bordered", position = "float_right") %>% column_spec (1:3, border_left = T, border_right = T) owner_probs owner_dse
补充:生成的表格TeX代码如下:
\subsection{Owner (On a Population of 350,000)}\label{owner-on-a-population-of-350000} \begin{longtabu} to \linewidth {|>{}l||>{}c||>{}c|} \caption{\label{tab:OWNER TABLE}Probability Table}\\ \toprule & In & Out\\ \midrule In & 0.56 & 0.14\\ Out & 0.24 & 0.06\\ \bottomrule \end{longtabu} \begin{longtabu} to \linewidth {|>{}l||>{}c||>{}c|} \caption{\label{tab:OWNER TABLE}DSE Table}\\ \toprule & In & Out\\ \midrule In & 196000 & 49000\\ Out & 84000 & 21000\\ \bottomrule \end{longtabu}
解决方案
问题根源
- 长表格不支持并排:你给
kable()设置了longtable = T,生成的是longtabu环境的长表格,这类表格专为跨页设计,默认占满整行宽度,无法实现并排。 - 宽度设置过满:生成的TeX代码中两个表格都用了
to \linewidth,直接占满页面宽度,自然无法放在同一行。
修正步骤
方案一:用kableExtra直接调整
去掉长表格设置,给每个表格指定宽度,配合浮动位置实现并排:
{r OWNER TABLE, echo = F} library(kableExtra) library(dplyr) owner_probs <- data.frame(In = c(0.56, 0.24), Out = c(0.14, 0.06)) row.names(owner_probs) <- c("In", "Out") owner_dse <- owner_probs * 350000 # 第一个表格:取消longtable,设置宽度为页面45%,左浮动 owner_probs <- owner_probs %>% kable(booktabs = T, align = "c", caption = "Probability Table") %>% kable_styling(bootstrap_options = "bordered", position = "float_left", width = "45%") %>% column_spec(1:3, border_left = T, border_right = T) # 第二个表格:取消longtable,设置宽度为页面45%,右浮动 owner_dse <- owner_dse %>% kable(booktabs = T, align = "c", caption = "DSE Table") %>% kable_styling(bootstrap_options = "bordered", position = "float_right", width = "45%") %>% column_spec(1:3, border_left = T, border_right = T) # 输出表格 owner_probs owner_dse # 手动添加垂直间距,避免后续内容与浮动表格重叠 cat("\\vspace{1em}")
方案二:用TeX minipage环境精细控制
如果需要更灵活的排版,可直接生成TeX代码并用minipage包裹:
{r OWNER TABLE, echo = F, results='asis'} library(kableExtra) library(dplyr) owner_probs <- data.frame(In = c(0.56, 0.24), Out = c(0.14, 0.06)) row.names(owner_probs) <- c("In", "Out") owner_dse <- owner_probs * 350000 # 生成不带自动环境的表格TeX代码 tab1 <- owner_probs %>% kable(booktabs = T, align = "c", caption = "Probability Table", format = "latex") %>% kable_styling(bootstrap_options = "bordered") %>% column_spec(1:3, border_left = T, border_right = T) tab2 <- owner_dse %>% kable(booktabs = T, align = "c", caption = "DSE Table", format = "latex") %>% kable_styling(bootstrap_options = "bordered") %>% column_spec(1:3, border_left = T, border_right = T) # 用minipage将两个表格放在同一行,中间留空隙 cat("\\begin{minipage}{0.45\\linewidth}") cat(tab1) cat("\\end{minipage}") cat("\\hfill") # 表格间自动填充空隙 cat("\\begin{minipage}{0.45\\linewidth}") cat(tab2) cat("\\end{minipage}")
注意事项
- 不需要跨页的表格别用
longtable,这是并排失败的核心原因。 - 两个表格的总宽度要小于页面宽度,比如各占45%,留10%空隙避免拥挤。
- 使用浮动位置时,记得在表格后添加
\\vspace{1em}这类命令,防止后续内容与表格重叠。
内容的提问来源于stack exchange,提问作者Miller25
相关产品推荐
相关产品推荐

