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

QY *_*Luo 12 r knitr r-markdown dt

我有一个包含多个变量的表,其中包含长变量名和长字符串作为多个观察值.如何显式设置每个列宽,因此通过R Markdown呈现为HTML的表不会自动将行加倍以使长字符串适合单元格?

即使表格无法同时显示所有列,我也可以使用足够长的列.但是,我总是可以使用'FixedColumns'扩展名和滚动条向右移动以获得更多列.

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

options = list(
    autowidth = TRUE,
    columnDefs = list(list(width = '600px', targets = c(1, 2))),
Run Code Online (Sandbox Code Playgroud)

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

以下是我在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)
```
Run Code Online (Sandbox Code Playgroud)

以下是使用上述代码在HTML中生成的DT的屏幕截图: 在此输入图像描述

我真正想要的是将前两列的列宽设置得足够长,因此每行中的值不会像这样杂乱.我还希望列4:9的宽度设置相同.但看起来目前这些列的宽度取决于变量名的长度,这看起来并不那么好.我可以在这里做些改进的解决方法吗?谢谢,

Ben*_*sen 5

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

<style>
table.display td { white-space: nowrap; }
</style>
Run Code Online (Sandbox Code Playgroud)

或者创建一个单独的.ccs文件并将其包含在 yaml 标头中。有关该问题的进一步讨论,请参阅克利夫顿的评论。

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

```{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)
```
Run Code Online (Sandbox Code Playgroud)

我认为这与此处关于使用扩展时设置宽度的观点有关fixedColumns