我在Shiny应用程序中有一个DataTable,允许用户选择列。我想控制列的宽度,但该列的索引会根据用户选择而更改,因此我想根据列名控制宽度。
在下面的可重复示例中(这只是我想要做的一个例子),我想控制列的宽度" c"。起初我知道索引,所以这很好,但是当用户添加一个新列(" b")时,列宽格式将应用于任何列为秒(index = 1)。
请注意,DataTables的文档表明可以使用target=c("c")
,但link似乎表示该功能不起作用。
library(shiny)
ui <- shinyUI(
tagList(
navbarPage(title = HTML('<span class="navtitle">Test</span>'),
id= "myid",
inverse=TRUE,
collapsible = TRUE,
tabPanel("Home",
selectInput('myselect', label="", choices=c("a", "b", "c"),
selected = c("a", "c"), multiple=TRUE),
dataTableOutput(outputId="dataTable")
)
)
)
)
server <- function(input, output, session){
output$dataTable <- renderDataTable({
dat <- data.frame(a=1:10, b=1:10, c=1:10)
dat[, names(dat)%in%input$myselect]
},
options = list(pageLength = 100, dom='frtp',
scrollX = TRUE,
columnDefs = list(list(width = '30px', targets = c(1))))
)
}
shinyApp(ui=ui, server=server)
答案 0 :(得分:1)
感谢@Yihui在this post
的回答你可以在选项中使用一个非常有用的功能
library(shiny)
ui <- shinyUI(
tagList(
navbarPage(title = HTML('<span class="navtitle">Test</span>'),
id= "myid",
inverse=TRUE,
collapsible = TRUE,
tabPanel("Home",
selectInput('myselect', label="", choices=c("a", "b", "c"),
selected = c("a", "c"), multiple=TRUE),
dataTableOutput(outputId="dataTable")
)
)
)
)
server <- function(input, output, session){
output$dataTable <- renderDataTable({
dat <- data.frame(a=1:10, b=1:10, c=1:10)
dat[, names(dat)%in%input$myselect]
},
options = function(){
indx <- c(which("b"%in%input$myselect))
if(length(indx)==0) index <- ''
list(
pageLength = 100,
dom='frtp',
scollX = TRUE,
columnDefs = list(list(width = '30px', targets = indx))
)
}
)
}
shinyApp(ui=ui, server=server)