使用塌陷和行形电缆时,如何解决pdf文档中长表的对齐/显示问题?

时间:2019-04-18 20:25:13

标签: r pdf kable longtable

我必须生成具有很长表的数据列表,这些表必须显示在几页上,并且我想折叠一些行(例如ID)。

我正在使用包kable来生成表,并使用collapse_row函数来折叠我的ID行。

当我编织成pdf时,列中具有折叠行的对齐方式完全混乱了,甚至我的ID都出现在表外或重复出现的标题中……

这是我的代码:

kable(data, "latex", booktabs = T,longtable = T, linesep = "", row.names = FALSE) %>%
kable_styling(full_width = T,
              position = "center",
              latex_options = c("striped", "repeat_header","hold_position"),
              font_size = 6,5)%>%
  column_spec(c(1),  color = "black", width = "5em")%>%
  column_spec(c(2), color = "black", width = "30em")%>%
  collapse_rows(1, latex_hline = "custom",valign = "top")%>%
  row_spec(0, bold = T, color = "black")

这是我的pdf输出的样子:

<a href="https://ibb.co/VHB3VSy"><img src="https://i.ibb.co/VHB3VSy/Screen-Shot-2019-04-18-at-13-05-57.png" alt="Screen-Shot-2019-04-18-at-13-05-57" border="0"></a> 线条位置很好,但ID移到顶部。

我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:1)

看起来像是LaTeX问题,表格中的垂直对齐方式。

有关github问题的引言:

  

[...]似乎书本的cmidrule弄乱了multirow的计算。

     

[...]我不知道是否可以找到一个好的解决方案。我当然可以删除那些中线。我也不喜欢它们,但是它们对于具有多个标题列的表很重要。如果我们保留这些中线,TeX员工会说您可以手动将调整添加到多行。我当然可以通过代码来模拟它,但将来似乎会给我带来更多问题。

来源:https://github.com/haozhu233/kableExtra/issues/56

其他参考:

This solution在遇到相同问题的情况下效果很好。该解决方案基于在输出到kable之前对data.frame进行操作,而不是使用crash_rows更改kable的输出。原始贡献者(Michael Harper)开发了它以便与formattable包一起使用,但是可以很容易地为kable包进行调整。

您需要声明此函数:

collapse_rows_df <- function(df, variable){

group_var <- enquo(variable)

  df %>%
    group_by(!! group_var) %>%
    mutate(groupRow = 1:n()) %>%
    ungroup() %>%
    mutate(!!quo_name(group_var) := ifelse(groupRow == 1, as.character(!! group_var), "")) %>%
    select(-c(groupRow))
}

该函数将除去指定列中除第一次遇到的所有数据,而留空白。

您需要先调用该函数,然后再将数据发送到kable。请参见下面的示例:

library(knitr) # required for kable()

# dfToKable - your data.frame you need to kable
# columnToCollapseRows - the name of the column, in which you want to collapse the rows; 
#   it should be a valid variable within the data.frame set and be passed without quotes

kable( collapse_rows_df( dfToKable, columnToCollapseRows ),
      row.names = F, escape = F, longtable = TRUE) %>% 
      kable_styling(full_width = T, latex_options = c("repeat_header"))

根据您提供的代码和屏幕截图,这应该适合您:

kable( collapse_rows_df( data, SubID) "latex", booktabs = T,longtable = T, linesep = "", row.names = FALSE) %>%
kable_styling(full_width = T,
              position = "center",
              latex_options = c("striped", "repeat_header","hold_position"),
              font_size = 6,5)%>%
  column_spec(c(1),  color = "black", width = "5em")%>%
  column_spec(c(2), color = "black", width = "30em")%>%
  row_spec(0, bold = T, color = "black")