Блестящая ширина столбца DataTable по имени

У меня есть DataTable в приложении Shiny, и пользователю разрешено выбирать столбцы. Я хочу контролировать ширину столбца, но индекс этого столбца изменяется в зависимости от выбора пользователя, поэтому я хочу контролировать ширину на основе имени столбца.

В приведенном ниже воспроизводимом примере (который является лишь примером того, что я хочу сделать), я хотел бы контролировать ширину столбца "с". Сначала я знаю индекс, так что это нормально, но когда пользователь добавляет новый столбец ("b"), форматирование ширины столбца применяется к любому второму столбцу (index = 1).

Обратите внимание, что документация для DataTables предполагает, что использование target=c("c") было бы возможно, но эта ссылка, кажется, говорит, что функциональность не работает.

    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)

1 ответ

Спасибо @Yihui за ответ на этот пост

Вы можете использовать функцию в настройках, очень полезно

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)
Другие вопросы по тегам