如何在Shiny中设置formattable可格式化表格的列宽?
给Shiny中formattable表格设置列宽的方法
嘿,我懂你想要给formattable生成的表格设置列宽的需求,其实这个功能formattable本身就支持,只是可能文档里没特别突出,下面给你两种简单好用的方法:
方法1:通过formattable的格式化函数直接指定列宽
你可以在定义列格式的时候,用formatter()函数结合style()来给每一列设置固定宽度,这种方式能针对单个列精准控制:
library(shiny) library(formattable) # 别忘了加载这个包,你的原代码里遗漏啦 list1 <- c(0.2,0.8,0.5) list2 <- c("element1", "element2", "element3") df <- data.frame(list1, list2) UI <- fluidPage( formattableOutput("table1") ) Server <- function(input, output) { output$table1 <- renderFormattable({ formattable(df, list( # 给list1列设置200px宽度,同时保留颜色瓷砖样式 list1 = color_tile("green", "red") %>% formatter("span", style = ~ style(width = "200px", display = "block")), # 给list2列设置300px宽度 list2 = formatter("span", style = ~ style(width = "300px", display = "block")) )) }) } shinyApp(ui = UI, server = Server)
这里加了display = "block"是为了让宽度设置生效,因为span默认是行内元素,转为块级元素才能撑满指定宽度。
方法2:用CSS全局控制表格和列宽
如果想要更灵活的全局样式控制,比如设置表格总宽度、按比例分配列宽,可以在UI里添加自定义CSS样式:
library(shiny) library(formattable) list1 <- c(0.2,0.8,0.5) list2 <- c("element1", "element2", "element3") df <- data.frame(list1, list2) UI <- fluidPage( # 添加自定义CSS tags$style(HTML(" #table1 table { width: 600px; /* 设置表格总宽度 */ table-layout: fixed; /* 固定表格布局,避免内容撑开列宽 */ border-collapse: collapse; /* 可选:合并边框让表格更美观 */ } /* 给第一列设置20%宽度 */ #table1 table td:nth-child(1), #table1 table th:nth-child(1) { width: 20%; background-color: #f5f5f5; /* 可选:加个背景色区分列 */ } /* 给第二列设置80%宽度 */ #table1 table td:nth-child(2), #table1 table th:nth-child(2) { width: 80%; } ")), formattableOutput("table1") ) Server <- function(input, output) { output$table1 <- renderFormattable({ formattable(df, list( list1 = color_tile("green", "red") )) }) } shinyApp(ui = UI, server = Server)
这种方法的优势是可以一次性控制所有列的样式,table-layout: fixed能让列宽严格按照你设置的比例或固定值显示,不会因为单元格内容过长而被撑开。
另外提醒下,你的原代码里忘记加载formattable包了,记得加上,不然程序会报错哦~
内容的提问来源于stack exchange,提问作者Henk Straten
相关产品推荐
相关产品推荐

