【发布时间】:2021-11-16 03:22:23
【问题描述】:
我正在使用 kable 为 Rmarkdown PDF 文档生成表格。我想根据它们的值突出显示某些单元格,并且每隔一行都有一个条纹。下图显示了这一点,以及我遇到的问题(取自我的 Adobe PDF 阅读器)。如您所见,中间行的突出显示颜色(用于帽带企鹅)与其他两个不太相同。这是一个小问题,但足以让表格看起来有点乱,所以我希望有人能帮我找到解决办法,或者至少解释一下原因。
奇怪的是,这个问题似乎取决于我在哪个 PDF 阅读器中查看文档。初始图像来自 Adobe,但是当我在 SumatraPDF(我的 RStudio 编织到的默认查看器)中打开文件时,突出显示是所有行一致(见下图)。此行为似乎与 PDF 查看器中的缩放级别无关,但可能与我不知道的另一个设置有关。
问题本身似乎是由浅蓝色条纹而不是突出显示本身引起的,因为当我删除条纹时,所有三个突出显示都在两个 PDF 查看器中。这种行为也可以在没有额外突出显示的情况下通过使用column_spec(c(2:3), width = "2.1cm", border_right = T) 向表格添加单元格边框来演示,如最终图像所示。在三行中的两行中,第二列的右边框被条带覆盖(这也发生在 kableExtra 中的内置条带功能中)。这里要注意的一件有趣的事情是,这 确实 似乎取决于 PDF 查看器的缩放级别。下图来自 Adobe 在我的默认视图 (75.5) 中,但是当我将缩放比例更改为 100 到 200 之间时,所有单元格边框都是正确的,然后再次消失。我的代码如下,感谢您的帮助!
可重现的示例
---
title: "Kable Highlighting Issue"
output: pdf_document
header-includes:
- \usepackage{booktabs}
- \usepackage{longtable}
- \usepackage{array}
- \usepackage{multirow}
- \usepackage{wrapfig}
- \usepackage{float}
- \usepackage{colortbl}
- \usepackage{pdflscape}
- \usepackage{tabu}
- \usepackage{threeparttable}
- \usepackage{threeparttablex}
- \usepackage[normalem]{ulem}
- \usepackage{makecell}
- \usepackage{titling}
- \usepackage{graphicx}
---
knitr::opts_chunk$set(echo = TRUE)
library(palmerpenguins)
library(dplyr)
library(stringr)
library(knitr)
library(kableExtra)
#create table data
table_data <- penguins %>%
group_by(species) %>%
summarise(bill_length_mm= round(mean(bill_length_mm, na.rm = TRUE), digits=2),
bill_depth_mm= round(mean(bill_depth_mm, na.rm = TRUE), digits=2)) %>%
mutate(across(everything(), as.character)) %>%
rename(length= bill_length_mm, depth= bill_depth_mm) #_ is an escaped character in Latex
#add general table striping
#the default Kable striping feature will overwrite the highlighting, so this is an alternative way to add that
#perhaps there's something simpler?
for (row in c(1,3)){
for (col in c(1,3)){
table_data[row,col] <- cell_spec(table_data[row,col], "latex", background = "#ddf1f7")
}
}
#add table highlighting if bill length > 40mm
for (p in table_data$species){
row <- which(table_data[1]==p)
if (table_data[row, 2] > 40){
table_data[row, 2] <- cell_spec(table_data[row, 2], "latex", background = "#00cc66")
} else {
table_data[row, 2] <- cell_spec(table_data[row, 2], "latex", background = "#ff704d")
}
}
#create table
penguin_table <- kable(table_data, format = "latex", booktabs = TRUE, linesep="", escape = FALSE, align=c("l","c","c")) %>%
kable_styling(latex_options = c("scale_down", "hold_position"), position = "center", font_size =12) %>%
row_spec(0, bold = TRUE, hline_after = TRUE) %>%
column_spec(1, width = "5cm") %>%
column_spec(c(2:3), width = "2.1cm")
penguin_table
会话信息
R version 4.0.3 (2020-10-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19042)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] kableExtra_1.3.4 knitr_1.33 stringr_1.4.0
[4] dplyr_1.0.4 palmerpenguins_0.1.0
loaded via a namespace (and not attached):
[1] pillar_1.4.7 compiler_4.0.3 tools_4.0.3 digest_0.6.27
[5] evaluate_0.14 lifecycle_1.0.0 tibble_3.0.4 viridisLite_0.3.0
[9] pkgconfig_2.0.3 rlang_0.4.10 DBI_1.1.0 cli_2.4.0
[13] rstudioapi_0.13 xfun_0.23 httr_1.4.2 xml2_1.3.2
[17] generics_0.1.0 vctrs_0.3.5 systemfonts_1.0.1 webshot_0.5.2
[21] tidyselect_1.1.0 svglite_2.0.0 glue_1.4.2 R6_2.5.0
[25] rmarkdown_2.8 purrr_0.3.4 magrittr_2.0.1 scales_1.1.1
[29] ellipsis_0.3.1 htmltools_0.5.0 assertthat_0.2.1 rvest_0.3.6
[33] colorspace_2.0-0 stringi_1.5.3 munsell_0.5.0 crayon_1.3.4
【问题讨论】:
标签: pdf r-markdown highlight kable kableextra