kableExtra 将不需要的额外行插入到某些单元格中,具体取决于单元格值

kableExtra inserts unwanted extra line into some cells, depending on cell value

我正在使用 kableExtra 生成 Rmarkdown table(在 Rstudio 1.2.1335 中,Windows 10)。其中一个单元格最终将其值推到另一行,这打乱了行距(见下图)。奇怪的是,如果我用另一个值手动替换矩阵中的那个单元格值,它有时会修复它,具体取决于替换值。我的代码如下(我已经尝试并未能制作一个可重现的示例 - 这个问题似乎只出现在我的实际数据中)。

est1 <- as.matrix(cbind(round(apply(sexClass2,2,mean),0),
             round(apply(sexClass2,2,mlv,method="lientz",bw=0.5),0),
             round(t(apply(sexClass2,2,hdi)),0)))
#est1[1,4] <- 38
load("FR_Coll_20200815_20201115_weekly_theta_df_Constrained.RData")
est2 <- cbind(round(apply(sexClass2,2,mean),0),
             round(apply(sexClass2,2,mlv,method="lientz",bw=0.5),0),
             round(t(apply(sexClass2,2,hdi)),0))
load("FR_Coll_20200815_20201115_weekly_theta.RData")
est3 <- cbind(round(apply(sexClass2,2,mean),0),
             round(apply(sexClass2,2,mlv,method="lientz",bw=0.5),0),
             round(t(apply(sexClass2,2,hdi)),0))
est <- rbind(est1,est2,est3)

cap <- "Abundance estimates for elk from the FR camera grid. Estimates reflect the subtraction of any animals known to have died during the study period."

colnames(est) <- c("Mean","Mode","LCrL","UCrL")
rownames(est) <- rep(c("Cows","Bulls","Calves","Cows + Calves", "Total"),times=3)
estFR <- est %>%
  kable(booktabs = TRUE, caption=cap, linesep = "",align=rep('r',4),escape=FALSE) %>%
  kable_styling(latex_options = c("hold_position"),full_width = FALSE) %>% 
  column_spec(1, width = "6cm")%>%
  column_spec(2:5, width = "2cm") %>%
  pack_rows("Group-specific detection parameters", 1,5) %>%
  pack_rows("Group-specific detection parameters, and IDs constrained", 6,10)%>%
  pack_rows("Constant detection parameters", 11,15)  

这会产生以下结果 table:

如果我取消注释该行 est1[1,4] <- 38,那么问题就会消失。如果我用 1 或 29 或 41 等替换该值,问题也会消失。但是如果我用 39 或 40 替换该值,那么单元格就会有多余的行。

最后,如果我使用完全相同的值生成矩阵 est1,那么就没有问题。但是我也加载并计算了est2est3中的值,那里没有问题。

我有三个相同构造的 table(完全相同的代码,仅更改输入数据文件)。在其中一个中,我看到了上述行为,仅针对那个单元格。在另一组中,我看到了第一组(但不是最后两组)中所有右列单元格的行为,而在第三组中,根本没有问题。

我试过各种其他技巧,例如 est1 <- est1*1,但都无济于事。奇怪的是,est1 <- est1/2 使间距问题消失,即使单元格值有更多字符(这应该使它更有可能换行)。 est1/2*2 没有用。

任何人都可以为这种看似非常奇怪的行为提供解释或解决方案吗?

我已经确定了问题(感谢 here, here, and here 发布的问题)。 问题是,当 table 中的两行相同时,会在第一个相同行的 LaTex 代码中插入一个 \vphantom{1},以区分这两个相同行。我在检查 Latex 文件时注意到了这一点 - table 的第一行是

\hspace{1em}Cows & 29 & 28 & 19 & \vphantom{1} 39\

一个解决方法(但可能不是一个非常令人满意的通用解决方案)是将插入的代码移动到行尾,例如 est[1,4] <- "39\vphantom{1}",这会产生

\hspace{1em}Cows & 29 & 28 & 19 & 39\vphantom{1}\

在 Latex 代码中,然后正确格式化 pdf 输出。

我不确定为什么相同的行有问题(为什么有必要使它们不相同),也不知道是否有更好的通用解决方案不需要更改table规格。

一个更通用但仍然很老套的解决方案是替换 knitr_kable 对象中的 \vphantom{1}

首先,重现问题:

> library(tidyverse)
> library(kableExtra)
> tbl = tibble(a = c(1,1), b = c(2,2)) %>% 
+   kbl(format = "latex") %>% 
+   column_spec(1)
> tbl

\begin{tabular}[t]{>{}r|r}
\hline
a & b\
\hline
1 & \vphantom{1} 2\
\hline
1 & 2\
\hline
\end{tabular}

删除所有 \vphantom{1}:

> tbl[1] = tbl %>% 
+   str_remove_all(fixed(" \vphantom{1}"))
> tbl

\begin{tabular}[t]{>{}r|r}
\hline
a & b\
\hline
1 & 2\
\hline
1 & 2\
\hline
\end{tabular}

警告:在某些情况下,这对我来说效果很好,而且我没有找到生成相同行的任何原因 non-identical。但是,这种行为似乎是有原因的,盲目删除 \vphantom{1} 可能会破坏事情。