在R Shiny DataTable中设置列宽度,在有大量列的情况下无效。

17
我需要在R Shiny应用程序中设置DataTable的列宽。我已经阅读了文档中的Data Table Options。此外,我还查看了Stackoverflow上thisthis的问题。
如果DataTable没有太多的列,设置宽度就可以正常工作。然而,在某些情况下,如果有多个列,则设置会被覆盖,即使使用绝对宽度单位(例如'600px')。
在下面的代码片段中:
output$mytable <- DT::renderDataTable({
  num_of_cols <- 3
  cbind(iris,iris)[,1:num_of_cols]},
  options = list(autoWidth = TRUE,
  columnDefs = list(list(width = '500px', targets = 1))))

如果我设置变量num_of_cols = 3,那么它可以正常工作。然而,增加显示的列(num_of_cols)会导致列宽减小。在显示多个列的情况下,宽度设置似乎没有效果。
我尝试了选项autoWidth = FALSE,但结果没有任何不同。我还尝试在this线程的答案部分中使用JavaScript选项drawCallback,但结果相同。
如何使DataTable显示所需的列宽设置?
2个回答

19

哇,我简直不敢相信。表格对象上的列宽应该很清楚,但对于数据表格来说却如此令人困惑。我花了很多时间研究这个问题,最终在RStudio的工具提示中找到了答案。

DT::renderDataTable({
      datatable(df) %>% formatStyle(columns = c(1,2), width='200px')
})

编辑:

这种方法可能有效,但实际上并没有比其他方法更好。我无法找到一种简单明了的方法来完成它。这是我现在正在使用的代码... 我认为我不需要使用任何其他东西。我不得不按列构建它,并不断地返回调整,才能使其正常工作。看起来像是应该修复的问题。

我将UI宽度值设置为1200px,完成后缩小了它。

#UI
DT::dataTableOutput(outputId = "tableID", width = '830px')
#Server
options = list(autoWidth = TRUE,
              columnDefs = list(list(targets=c(0), visible=TRUE, width='90'),
                                list(targets=c(1), visible=TRUE, width='145'),
                                list(targets=c(2), visible=TRUE, width='105'),
                                list(targets=c(3), visible=TRUE, width='100'),
                                list(targets=c(4), visible=TRUE, width='100'),
                                list(targets=c(5), visible=TRUE, width='100'),
                                list(targets=c(6), visible=TRUE, width='100'),
                                list(targets=c(7), visible=TRUE, width='90'),
                                list(targets='_all', visible=FALSE)

3
这个回答引起了很多关注,所以我想分享一下我的经验,我已经转向使用Python。当我第一次发现R时,它让我感到很兴奋,但我的经验是,许多功能很令人沮丧,比如DataTable格式。我现在用Python做所有的事情。Python可以做R能做的一切,而且做得更好,还可以做更多的事情,得到更好的支持,有更好的工具,代码更清晰、更简洁、更易于理解。看看Python的Plotly Dash,希望这能为你节省很多时间和痛苦。 - DonkeyKong
7
好故事。实际上,目前为止,Dash 甚至还远远不及 Shiny(译者注:Dash 和 Shiny 都是 Python 和 R 语言的可视化工具包)。 - DSGym
非常感谢您的答复。我还想补充一点,可能会破坏这些自定义列宽的设置。您需要确保 filter='none',否则最小列宽将对应于允许列过滤所需的宽度。 - Angelo
感谢@DonkeyKong!对我来说,只需在我的DT:datatable选项中进行更改就可以了,与您提到的类似: columnDefs = list(list( list(targets='_all', visible=TRUE, width='90') ) ``` 我只是想让所有列具有相同的宽度。 - Corina Roca
@DonkeyKong 感谢您转向Python。DT实际上很令人沮丧。我认为文档/网页布局不够清晰,而且列出的选项不支持参数自动完成。您能否指导我们进行Dash与Shiny的跨比较或提供具体示例? - undefined
@DSGym 你好,你有关于Dash和Python的任何参考资料吗? - undefined

11

此处所建议的那样,设置scrollX=T并在选项中保持autoWidth = TRUE应该可以解决问题。


1
感谢。令人沮丧的晦涩难懂。 - geotheory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接