如何使用 R Markdown 显式设置 R DT 表的列宽?

Posted

技术标签:

【中文标题】如何使用 R Markdown 显式设置 R DT 表的列宽?【英文标题】:How can I explicitly set column width for R DT tables using R Markdown? 【发布时间】:2016-08-27 14:59:00 【问题描述】:

我有一个包含多个变量的表,这些变量具有长变量名称和长字符串作为多个观察值的值。如何显式设置每个列的宽度,以便通过 R Markdown 呈现为 html 的表格不会自动将行加倍以将长字符串放入单元格中?

即使表格不能同时显示所有列,我也可以有一些足够长的列。但是,我总是可以使用“FixedColumns”扩展和滚动条向右移动更多列。

我目前用来设置列宽的代码是:

options = list(
    autowidth = TRUE,
    columnDefs = list(list(width = '600px', targets = c(1, 2))),

但是无论我如何设置不同的宽度,最终渲染的表格看起来并没有太大的不同。

这是我在 rmarkdown 中使用的一些可重现的代码,包括在 HTML 中生成模拟数据和 DT 对象。

```r
# generate data
vec_1 <- c("DHDH, DDDDDTV", 
       "DHDH, DDDDDTV, TT&T",
       "DHDH, DDDDDTV, TT&T, Caaater",
       "DHDH, DDDDDTV, TT&T, Caaater, Cxx",
       "DHDH, DDDDDTV, TT&T, Cxx",
       "DHDH, DDDDDTV, Caaater",           
       "DHDH, DDDDDTV, Caaater, Cxx",
       "DHDH, DDDDDTV, Cxx")

vec_2 <- c("Some radomn long string aaa bbb ccc dddd aaa bbb ccccccc", 
       "Some radomn long stringa",
       "Some string aaa bbb",
       "Some radomn long string aaa bbb ccc dddd aaa bb (A)",
       "Some radomn long string aaa bbb ccc dddd aaa b (B)",
       "Some radomn long string aaa bbb ccc dd (D)",
       "Some radomn long string aaa bbb ccc ddd (D)",
       "Some radomn long string aaa bbb ccc d (D)",
       "Some radomn long string aaa bbb ccc ddd aaa bbb dddaa (G)",
       "Some radomn long string aaa bbb ccc ddd aaa bbb dddaa(G)", 
       "Some radomn long string aaa bbb ccc ddd aaa bbb ddd (G)",
       "Some radomn long strin(H)",
       "Some radomn long string  (G)",
       "Some radomn long (Beee)")

col_1 <- sort(rep(vec_1, 14))
col_2 <- rep(vec_2, 8)
col_3 <- c(rep(105, 14), rep(29, 14), rep(22, 14), rep(2, 14),
       rep(10, 14), rep(29, 14), rep(5, 14), rep(8, 14))
col_4 <- rnorm(112)
col_5 <- rnorm(112)
col_6 <- rnorm(112)
col_7 <- rnorm(112)
col_8 <- rnorm(112)
col_9 <- rnorm(112)

df <- data.frame(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9)
```

```r
library(DT)

datatable(
    df,
    colnames = c("Source Type", "Factors",
                 "Market Counts", "Minimum", "1st Qu",
                 "Median", "Mean", "3rd Qu", "Maximum"),
    extensions = 'FixedColumns',
    options = list(
        autowidth = TRUE,
        columnDefs = list(list(width = '600px', targets = c(1, 2))),
        pageLength = 14,
        lengthMenu = c(7, 14, 28, 36),
        scrollX = TRUE,
        fixedColumns = TRUE
        )) %>%
    formatRound(4:9, digits = 2)
```

这是使用上述代码以 HTML 格式生成的 DT 的屏幕截图:

我真正想要的是为前两列设置足够长的列宽,这样每一行中的值就不会像这样混乱。我还希望将 4:9 列的宽度设置为相同。但看起来目前这些列的宽度取决于变量名的长度,这看起来不太好。我可以在这里做些什么来改进?谢谢,

【问题讨论】:

我觉得这里的问题和here基本一样:列太多,列宽被忽略了。 【参考方案1】:

您可以通过将以下 css 添加到您的 html 文件中来获得单行列:

<style>
table.display td  white-space: nowrap; 
</style>

或者,制作一个单独的 .ccs 文件并将其包含在 yaml 标头中。有关该问题的进一步讨论,请参阅 clifton here 的评论。

我无法快速设置其他列的宽度。我试过类似的东西:

```r
library(DT)

datatable(
    df,
    colnames = c("Source Type", "Factors",
                 "Market Counts", "Minimum", "1st Qu",
                 "Median", "Mean", "3rd Qu", "Maximum"),
    extensions = 'FixedColumns',
    options = list(
        autowidth = FALSE,
        columnDefs = list(list(width = '600px', targets = c(1, 2)),
                          list(width = '100px', targets = 3:(ncol(df) - 2))),
        pageLength = 14,
        lengthMenu = c(7, 14, 28, 36),
        scrollX = TRUE,
        fixedColumns = TRUE
        )) %>%
    formatRound(4:9, digits = 2)
```

我认为这与here 在使用fixedColumns 扩展时设置宽度有关的观点有关。

【讨论】:

以上是关于如何使用 R Markdown 显式设置 R DT 表的列宽?的主要内容,如果未能解决你的问题,请参考以下文章

R语言-在shiny中使用DT包的常用设置

是否应该在 invalidate(l,t,r,b) 之后显式设置剪辑区域?

如何使用 DT、R 和 Shiny 在表格的单元格中嵌入图像

如何在 R 中的数据表 DT 中添加行边框和斑马条纹(行条纹)?

如何在 lapply (R) 中显式定义附加参数

为 DT 输出渲染文本输入时出现 R 闪亮错误