You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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, "&nbsp;&nbsp;")
    )
  ) %>%
  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控制间距替代 

放弃手动添加&nbsp;,改用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:47:21