【问题标题】:kableExtra column_spec width not workingkableExtra column_spec 宽度不起作用
【发布时间】:2025-12-08 18:25:02
【问题描述】:

我正在创建将使用 Rmarkdown 呈现为 HTML 的表。我正在使用 kable 并且一直在尝试使用 kableExtra 向我的表格添加功能。将 column_spec 中的宽度选项应用于表中的所有列时,我无法使其工作:

data.frame(RRmin=1, RRmax=10) %>%
   dplyr::rename(`Reportable Range Min` = RRmin, `Reportable Range Max` = RRmax) %>%
   kable() %>%
   column_spec(1:2, width = "0.5in") %>%
   kable_styling(c("bordered", "condensed"), full_width = F)

这给出了一个看起来像this 的表。 我可以使宽度更长并且两列都会改变,但是当它变小时它似乎不起作用。我可以缩小一列,但不能缩小另一列:

data.frame(RRmin=1, RRmax=10) %>%
   dplyr::rename(`Reportable Range Min` = RRmin, `Reportable Range Max` = RRmax) %>%
   kable() %>%
   column_spec(1, width = "0.5in") %>%
   kable_styling(c("bordered", "condensed"), full_width = F)

这给出了一个看起来像this 的表。第一列已适当更改,但当我尝试更改两列的大小时无法获得此效果。我尝试使用 escape=F 为每一列分别做 column_spec 行,但我不确定接下来要尝试什么。

【问题讨论】:

    标签: html r-markdown kable kableextra


    【解决方案1】:

    我也遇到过 column_spec 无法正常工作的类似问题。通过使用 width_min 选项,我能够找到适合我目的的修复程序。也许这会有所帮助。

    我的问题是 column_spec 似乎没有调整任何列的宽度,即使我尝试了您上面提到的所有选项。结果是一些列太薄了。我设置了 width_min="3in" 并修复了它。这不是一个完美的解决方案,因为现在我剩下的其他列太宽了,但它至少使我的表格更具可读性。

    【讨论】:

      【解决方案2】:

      这可能有点晚了,但我一直在使用 kableExtra 包,看来您的代码现在几乎可以正常工作了。

      起初我认为这可能与 kable_styling 组件的顺序有关,但它的顺序似乎无关紧要。也许这是包中的一个错误,此后已修复。无论您使用column_spec(column = 1:2, width = "2in") 还是column_spec(1:2, width = "2in"),也无关紧要。两者似乎都运行良好,对列大小的修改也是如此。见下文:

      ---
      output: pdf_document
      ---
      
      ```{r global_options, include=FALSE}
      # Just some setup:
      
      sapply(c("knitr", "tidyverse", "kableExtra"), require, character.only = TRUE)
      
      options(knitr.kable.NA = '', knitr.table.format = "latex")
      
      knitr::opts_chunk$set(fig.path = 'figures/',
                        echo = FALSE, warning = FALSE, message = FALSE)
      
      opts_chunk$set(echo = FALSE,
                 message = FALSE,
                 warning = FALSE,
                 fig.align = "center",
                 fig.width = 5,
                 fig.pos = 'H',
                 as.is = TRUE)
      ```
      
      ```{r variable-names-table, as.is=TRUE}
      # Size example 1; 1.5 inch columns
      data.frame(RRmin=1, RRmax=10) %>%
          dplyr::rename(`Reportable Range Min` = RRmin, `Reportable Range Max` = RRmax) %>%
         kable() %>%
         kable_styling(c("bordered", "condensed"), full_width = F) %>%
         column_spec(column = 1:2, width = "1.5in")
      
      # Size example 2; 3 inches
      data.frame(RRmin=1, RRmax=10) %>%
          dplyr::rename(`Reportable Range Min` = RRmin, `Reportable Range Max` = RRmax) %>%
         kable() %>%
         column_spec(column = 1:2, width = "3in") %>%
         kable_styling(c("bordered", "condensed"), full_width = F)
      
      # To set columns 1 and two to different sizes
      data.frame(RRmin=1, RRmax=10) %>%
          dplyr::rename(`Reportable Range Min` = RRmin, `Reportable Range Max` = RRmax) %>%
         kable() %>%
         column_spec(column = 1, width = "3in") %>%
         column_spec(column = 2, width = "2in") %>%
         kable_styling(c("bordered", "condensed"), full_width = F)
      
      ```
      

      只是给其他处理该问题的人的注释。以上将作为 RMD 运行

      R 版本 3.6.1,在 Mac 上 RStudio 1.2.1335 kableExtra 1.1.0 针织机 1.25 tidyverse 1.2.1

      【讨论】:

      • 我还是同样的问题,这个bug没有修复
      • 嗨 Shahab,如果您将我编写的代码复制并粘贴到新的 RMD 中,它会生成具有正确宽度的表格的 PDF 吗?
      • 还有一点需要提及的是,这段代码是使用 Tex Live 2019 发行版编译的。
      【解决方案3】:

      只需将宽度替换为 width_min!

      【讨论】:

        【解决方案4】:

        我正在使用 Tex Live 2020,但此问题仍然存在 - column_spec 似乎存在错误。如果我删除 column_spec 命令,所有这些示例都可以正常运行。一旦我包含 column_spec 命令,我就会收到一个神秘的错误,上面写着“未定义的控制序列,Latex 错误:数组 arg. The description is also cryptic: ...n}|>{\raggedleft\arraybackslash}p{1.5in} 中的非法字符}

        顶行末尾的控制序列 您的错误消息从未被 \def'ed。如果你有 拼写错误(e.g., \hobx), type I and the correct spelling (e.g., I\hbox). Otherwise just continue, and I'll forget about whatever was undefined. 删除 column_spec 命令可以解决问题。

        【讨论】:

          【解决方案5】:

          解决方法是在 Latex 序言中包含数组包。一种方法是将以下行添加到您的 Rmarkdown 标头:

          header-includes:
            - \usepackage{array}
          

          【讨论】: