Quarto中kableExtra的pack_rows()导致 被渲染为文本的问题
解决kableExtra中pack_rows()导致 被渲染为文本的问题
问题背景
在Quarto(knitr引擎)渲染HTML文档时,为kableExtra表格的列添加 实现尾随空格,单独使用kable()可正常渲染;但添加pack_rows()分组后, 会被直接显示为文本,即使在kable()中设置escape = FALSE也无效。
正常工作的代码
library(tidyverse) library(kableExtra) set.seed(404) mtcars_tbl <- mtcars %>% mutate( p = round(runif(nrow(.), 0, .1), 2), p = case_when( p < .05 ~ paste0(p, "*"), TRUE ~ paste0(p, " ") ) ) %>% select(mpg, hp, p) mtcars_tbl %>% head() %>% kable(align = "lrrr")
添加pack_rows()后失效的代码
mtcars_tbl %>% head() %>% kable(align = "lrrr") %>% pack_rows(index = c("group 1" = 3, "group 2" = 3))
解决思路
方法1:为pack_rows()也设置escape = FALSE
pack_rows()函数默认开启escape = TRUE,会对表格内容再次转义。需要同时在kable()和pack_rows()中关闭转义:
mtcars_tbl %>% head() %>% kable(align = "lrrr", escape = FALSE) %>% pack_rows(index = c("group 1" = 3, "group 2" = 3), escape = FALSE)
方法2:用CSS控制间距替代
放弃手动添加 ,改用HTML标签结合CSS设置右侧内边距,避免转义冲突:
mtcars_tbl <- mtcars %>% mutate( p = round(runif(nrow(.), 0, .1), 2), p = case_when( p < .05 ~ paste0(p, "*"), TRUE ~ paste0('<span style="padding-right: 1em;">', p, '</span>') ) ) %>% select(mpg, hp, p) mtcars_tbl %>% head() %>% kable(align = "lrrr", escape = FALSE) %>% pack_rows(index = c("group 1" = 3, "group 2" = 3), escape = FALSE)
方法3:用column_spec()统一设置列间距
如果只是为了对齐需求,直接通过column_spec()为目标列添加CSS内边距,无需手动处理HTML实体:
mtcars_tbl %>% mutate(p = ifelse(p < .05, paste0(p, "*"), as.character(p))) %>% head() %>% kable(align = "lrrr") %>% pack_rows(index = c("group 1" = 3, "group 2" = 3)) %>% kable_styling(full_width = FALSE) %>% column_spec(3, extra_css = "padding-right: 1em;")
内容的提问来源于stack exchange,提问作者einGlasRotwein
相关产品推荐
相关产品推荐

